将图像硬编码到类文件中
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());
【讨论】:
以上是关于将图像硬编码到类文件中的主要内容,如果未能解决你的问题,请参考以下文章