【发布时间】:2011-01-04 21:46:44
【问题描述】:
我正在尝试从二进制文件创建图像。该文件包含一个 32x32 图标及其对应的 16 色调色板。
规格
图标长度为 512 字节。图标以 4x4 的图块分隔。每个图块为 4x8 字节。
这是单个图块的 4x8 字节排列:
B B B B
B B B B
B B B B
B B B B
B B B B
B B B B
B B B B
B B B B
这是从上述字节扩展而来的位:
11110000 11110000 11110000 11110000
00001111 00001111 00001111 00001111
11110000 11110000 11110000 11110000
00001111 00001111 00001111 00001111
11110000 11110000 11110000 11110000
00001111 00001111 00001111 00001111
11110000 11110000 11110000 11110000
00001111 00001111 00001111 00001111
将每个字节分成四个像素,每个像素给出以下图块:
1111 0000 1111 0000 1111 0000 1111 0000
0000 1111 0000 1111 0000 1111 0000 1111
1111 0000 1111 0000 1111 0000 1111 0000
0000 1111 0000 1111 0000 1111 0000 1111
1111 0000 1111 0000 1111 0000 1111 0000
0000 1111 0000 1111 0000 1111 0000 1111
1111 0000 1111 0000 1111 0000 1111 0000
0000 1111 0000 1111 0000 1111 0000 1111
每4位是调色板中颜色的索引。
调色板长 32 个字节,包含 16 种颜色。每种颜色为 16 位(每个组件 5 个,而最后一个未使用)。
问题 - 第 1 步
我已经设法将图像数据解析为一个 512 字节的数组,并将调色板解析为一个 32 字节的数组。但我不确定如何从这里继续。
我将所有图像数据字节读入 BitSet,但我不确定这是否有用。
另外,我不知道如何从两个字节构造颜色。
任何帮助/建议/cmets?
谢谢。
问题 - 第 2 步
在您的帮助下,我从调色板中创建了一个 IndexColorModel,如下所示:
int[] colors = new int[16*3];
for (int i = 0; i < 16; i++) {
byte b1 = this.palette[i]; // byte 1: 5 bits of R and 3 bits of G
byte b2 = this.palette[i+1]; // byte 2: 2 bits of G and 5 bits of B and 0.
// colors are encoded in inverse order
colors[i+2] = (b2 & 0x3E) >>> // red
colors[i+1] = ((b1 & 0x07) << 2) | ((b2 & 0xC0) >> 6); // green
colors[i] = (b1 & 0xF8) >>> 3; // blue
}
IndexColorModel cm = new IndexColorModel(5, 16*3, colors, 0, false, 0, DataBuffer.TYPE_BYTE);
现在我需要使用上面的 IndexColorModel 从二进制文件中读取的字节数组创建一个 BufferedImage。
到目前为止,我有这个:
DataBuffer buffer = new DataBufferByte(this.titleData, 32*32);
int pixelStride = 4; //assuming r, g, b, skip, r, g, b, skip...
int scanlineStride = 4*32; //no extra padding
int[] bandOffsets = {0, 1, 2}; //r, g, b
WritableRaster raster = Raster.createInterleavedRaster(buffer, 32, 32, scanlineStride, pixelStride, bandOffsets, null);
boolean isAlphaPremultiplied = false;
BufferedImage bim = new BufferedImage(cm, raster, isAlphaPremultiplied, null);
取自here。
this.titleData 是一个 512 字节的数组,从二进制文件中读取。
以上代码抛出如下异常:
原因:java.awt.image.RasterFormatException: 数据数组太小(应该是4094)
有什么帮助吗?再次感谢您。
【问题讨论】:
-
下一步计划是什么?您想在画布上绘制此图标,还是将其输出到图形文件?
-
在画布上绘制,特别是 JLabel。
-
这个有趣的问题值得 +1。