给定图像的宽度,高度,深度和字节数组,我需要创建一个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)),其中深度为位。
我尝试更改每个像素的字节顺序,但它没有解决问题。在应该是纯黑色的区域,它可以是黑色,白色和黑色的混合物,或者全白色。
答案 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
。你可以尝试一些事情:
ImageData
构造函数所期望的字节顺序bytes
数组中的单个像素内随机播放imageBytes
。例如,在32位的情况下,[0 0 0 255]
变为[255 0 0 0 ]
。答案 1 :(得分:0)
鉴于(a)你正在使用未知的图形格式和(b)你有灰色问题,我怀疑高位不是用于颜色而是用于其他一些功能(可能是透明度/ alpha)。这可以很容易地使预期的所有黑色图像变为灰色50%。
在每个图像字节(或16位或......)上尝试一个简单的位操作,并将高位设置为零。
对于单个字节,即:
finalByte = originalByte & 0x7f;
此位也可能是行程编码(RLE)或其他varint编码的标记,但如果您获得正确的图像大小/尺寸,则可能不是这种情况。