给定图像的宽度,高度,深度和字节数组,我需要创建一个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 回答
从您描述的症状来看,它正在经历 endpoints 问题 . 看起来Java的
byte
数据类型是8-bits only,因此当您构建16位图像时,总共有两个Javabytes
构成构造图像中的单个像素 . 显然,对于32位图像,每个像素的Javabytes
数量将为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 ]
.鉴于(a)你正在使用未知的图形格式和(b)你有灰色问题,我怀疑高位不是用于颜色,而是用于其他一些功能(可能是透明度/ alpha) . 这可以很容易地使预期的所有黑色图像50%灰色 .
在每个图像字节(或16位或......)上尝试一个简单的位操作,并将高位设置为零 .
对于单个字节,即:
finalByte = originalByte & 0x7f;
此位也可能是行程编码(RLE)或其他varint编码的标记,但如果您获得正确的图像大小/尺寸,则可能不是这种情况 .