将图像硬编码到类文件中

Posted

技术标签:

【中文标题】将图像硬编码到类文件中【英文标题】:Hard Code Image into class file 【发布时间】:2014-07-21 17:06:41 【问题描述】:

我过去下载了一个工具,该工具将图像文件作为输入并输出一个源文件,该源文件扩展了可用于图形的Image 类。我现在有这个工具的实际应用程序,但我不再有副本。我已经搜索了很多次,希望能再次找到它。

我想知道如何在类中对图像进行硬编码(不加载外部图像)。我实际上会使用char[] 来存储所有字节,但是数组有一个图像经常超过的长度大小限制。

提前致谢。

【问题讨论】:

你确定你真的需要将图像存储在一个类中吗?从存储在 JAR 文件中的资源加载图像对我来说似乎是最自然的方法。它不会将图像存储在类中,但如果您将应用程序构建为 JAR 或 WAR 文件,则不需要外部文件。好处是图像可以按原样存储在您的源目录中,因此您可以例如使用常规图像编辑器对其进行编辑,如果它在类中进行编码,则无法进行编辑。 【参考方案1】:

您可以对数据进行 base64 编码。

Apache commons 编解码器提供 base64 编码器和解码器。然后您可以使用online tool 将您的图像编码为base64。只需在包含编码器输出的文本的 java 文件中编写一个文字字符串。

要访问图像,首先将 Base64 字符串解码为字节数组。

然后您可以创建图像: ImageIO.read(new ByteArrayInputStream(base64bytes))

您的长度大小限制本质上也无关紧要,因为 java 数组的大小限制是整数类型,超过 20 亿或 2 GB。

【讨论】:

哦,是的,我以为length 很短……我试试看。【参考方案2】:

一种可能的方法是将图像字节存储为类中的String。例如,LWJGL 在LWJGLUtil class 中使用这种方式。他们使用以下函数将字符串转换为ByteBuffer

private static ByteBuffer loadIcon(String data) 
    int len = data.length();
    ByteBuffer bb = BufferUtils.createByteBuffer(len);
    for(int i=0 ; i<len ; i++) 
        bb.put(i, (byte)data.charAt(i));
    
    return bb.asReadOnlyBuffer();

BufferUtils.createByteBuffer 声明为

public static ByteBuffer createByteBuffer(int size) 
    return ByteBuffer.allocateDirect(size).order(ByteOrder.nativeOrder());

【讨论】:

以上是关于将图像硬编码到类文件中的主要内容,如果未能解决你的问题,请参考以下文章

为啥在php中硬编码用户名密码安全威胁?

在 C 中硬编码或替换 char **argv

我可以在我的代码中硬编码字形索引吗?

TYPO3:在 Fluid 模板中硬编码的语言相关变量

如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码

如何在 appSettings.json 中硬编码和读取字符串数组?