给定图像的宽度、高度、深度和字节数组,我需要创建一个 SWT Image 对象。目前,我在给出 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 * (深度/8)),其中深度以位为单位。
我尝试更改每个像素的字节顺序,但它没有解决问题。在应该是纯黑色的区域,它要么是黑色、白色和黑色的混合色,要么是全白色。
最佳答案
从您描述的症状来看,您可能遇到了字节序问题。看起来 Java 的 byte
数据类型是 8-bits only ,因此当您构建 16 位图像时,总共两个 Java 字节
构成构建图像中的单个像素。显然,对于 32 位图像,每个像素的 Java 字节数将为 4。
例如,在大端 32 位世界中,[0 0 0 255]
将是非常深的灰色(本质上是黑色)。另一方面,在小端世界中,它会非常接近白色。
一些问题:
- 您如何填充
imageBytes
数组? - 它的尺寸是多少?如果
深度
以位为单位,人们会认为它是宽度*高度*深度/8
。
您可以尝试的一些事情:
- 阅读 SWT 文档以了解
ImageData
构造函数所需的字节顺序 - 随机排列
imageBytes
数组中单个像素内的字节
。例如,在 32 位情况下,[0 0 0 255]
变为[255 0 0 0 ]
。
关于java - 从字节数组创建 16 或 32 位图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4253512/