首页 文章

从字节数组创建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数组的大小是(width * height *(depth / 8)),其中深度以位为单位 .

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

2 回答

  • 0

    从您描述的症状来看,它正在经历 endpoints 问题 . 看起来Java的 byte 数据类型是8-bits only,因此当您构建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编码的标记,但如果您获得正确的图像大小/尺寸,则可能不是这种情况 .

相关问题