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

标签 java image image-processing swt rgb

给定图像的宽度、高度、深度和字节数组,我需要创建一个 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/

相关文章:

java - 如何在 Java 流中配对不均匀列表

java - 如何从csv文件中读取特定数据并将其删除?

python - mayavi - 以编程方式设置图像的 [x,y,z] 范围

linux - 上一个图像中存在文件夹时,docker RUN mkdir 不起作用

java - 如何防止对象自动转换为字符串

java - JSON 到 Java 中的对象?

image - 如何找到图像的位深度

matlab - Canny 边缘检测器上可能的 NaN 梯度方向 - matlab 上的图像处理

c++ - 如何将 OpenCV Mat 转换为 Halide Image 并返回?

image - 如何估计将按比例缩小的 JPEG 图像的大小