gpt4 book ai didi

Java:从二进制数据(图像数据和调色板)创建图像

转载 作者:行者123 更新时间:2023-12-04 06:59:47 24 4
gpt4 key购买 nike

我正在尝试从二进制文件创建图像。该文件包含一个 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,但我不确定这是否有用。

另外,我不知道如何从两个字节构造颜色。

任何帮助/建议/评论?

谢谢你。

问题 - 第 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 字节的数组,从二进制文件中读取。

上面的代码抛出以下异常:

Caused by: java.awt.image.RasterFormatException: Data array too small (should be 4094 )



有什么帮助吗?再次,非常感谢你。

最佳答案

javax.imageio.ImageIO class 及其亲属是您所需要的。本质上,javax.imageio包裹。

我忘记了细节,但该框架甚至允许您在内存结构和输出文件之间进行映射时定义自定义颜色编码(即每种颜色的位数及其顺序)。

更新

仍在等待您的答案,无论是文件 I/O 还是本地镜像。同时...

如果你看类(class)java.awt.image.BufferedImage ,您将看到用于编码一些常用位到像素映射的常量、用于从光栅创建图像的构造函数、用于设置颜色模型的方法、用于设置光栅等。

您可能还想查看有关此内容的不错的教程。我去找一个...

要回答如何将两个字节映射为一种颜色的问题,请查看 java.awt.image.ColorModeljava.awt.image.ComponentColorModel .我认为第二个是你想要的。

关于Java:从二进制数据(图像数据和调色板)创建图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com