从字节数组创建16位或32位图像

3

给定图像的宽度、高度、深度和字节数组,我需要创建一个SWT图像对象。目前,当给出8位图像的数据时,我没有任何问题。

int imageWidth;
int imageHeight;
int depth;
byte[] imageBytes;
//calculate the values

imageData = new ImageData( imageWidth, imageHeight, depth, new PaletteData(255,255,255), 1, imageBytes);
new Image( display, imageData );

我遇到的问题是对于16位图像,颜色有些偏差。本应为黑色的像素实际上是灰色的。
对于32位图像,只有少数黑色像素出现,其余部分为白色。
您有什么想法吗?
谢谢。
编辑:imageBytes数组是从我无法获取规范的专有图形文件中读取的(因此我不完全确定格式)。
我在32位图像上取得了一些进展。看起来32位图像是RGBAX格式之一。我将其转换为24位图像,现在它与16位图像具有相同的问题(灰色应该是黑色)。
imageBytes数组的大小为(宽度*高度*(深度/8)),其中深度以位为单位。
我尝试更改每个像素的字节顺序,但它并没有解决问题。在应该是纯黑色的区域,它可能是黑色的、白色和黑色的混合或全部是白色。

听起来解决你的问题的关键是理解你正在处理的专有格式。除非你完全理解这个格式,否则当读取16或32位图像时,你可能没有正确地填充imageBytes。这意味着问题可能发生在你发布的代码执行之前。如果你分享图片、用于读取它的完整代码以及你得到的结果截图,你可能能够获得帮助理解图像格式。如果没有这些信息,我或其他人就无法做更多事情了。 - mpenkov
2个回答

0

从您描述的症状来看,您可能正在经历字节序问题。看起来Java的byte数据类型仅支持8位,因此在构建16位图像时,两个Java bytes组成一个构建图像中的单个像素。显然,对于32位图像,每个像素的Java bytes数量将为4。

例如,在大端32位世界中,[0 0 0 255]将是相当暗的灰色(基本上是黑色)。另一方面,在小端世界中,它将非常接近白色。

一些问题:

  • 您如何填充imageBytes数组?
  • 它的尺寸是多少?如果depth以位为单位,则可以假定其为width*height*depth/8

您可以尝试以下一些方法:

  • 阅读 SWT 文档以查找 ImageData 构造函数所期望的字节序。
  • imageBytes 数组中对单个像素内的 bytes 进行洗牌。例如,在 32 位情况下,[0 0 0 255] 变为 [255 0 0 0 ]

0

鉴于(a)您正在使用未知的图形格式,以及(b)您遇到了灰度问题,我怀疑高位不是用于颜色而是用于其他功能(可能是透明度/ alpha)。这很容易使预期的全黑图像变为50%灰度。

尝试对每个图像字节(或16位或...)进行简单的位运算,并将高位设置为零。

对于单个字节,即: finalByte = originalByte & 0x7f;

这个位也可能是用于运行长度编码(RLE)或其他varint编码的标记,但如果您获得了正确的图像大小/尺寸,则可能不是这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接