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

时间:2010-11-23 06:58:42

标签: java image image-processing swt rgb

给定图像的宽度,高度,深度和字节数组,我需要创建一个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数组的大小为(width * height *(depth / 8)),其中深度为位。

我尝试更改每个像素的字节顺序,但它没有解决问题。在应该是纯黑色的区域,它可以是黑色,白色和黑色的混合物,或者全白色。

2 个答案:

答案 0 :(得分:0)

根据您描述的症状,您可能遇到了字符串问题。看起来Java的byte数据类型是8-bits only,因此当您构建16位图像时,总共有两个Java bytes构成构造图像中的单个像素。显然,对于32位图像,每个像素的Java bytes数量将为4。

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

有些问题:

  • 您如何填充imageBytes阵列?
  • 它的尺寸是多少?如果width*height*depth/8是比特,可以假设它是depth

你可以尝试一些事情:

  • 阅读SWT文档以找出ImageData构造函数所期望的字节顺序
  • bytes数组中的单个像素内随机播放imageBytes。例如,在32位的情况下,[0 0 0 255]变为[255 0 0 0 ]

答案 1 :(得分:0)

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

在每个图像字节(或16位或......)上尝试一个简单的位操作,并将高位设置为零。

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

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

相关问题