【问题标题】:Creating 16 or 32 bit image from byte array从字节数组创建 16 或 32 位图像
【发布时间】:2010-11-23 06:58:42
【问题描述】:

给定图像的宽度、高度、深度和字节数组,我需要创建一个 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 * (depth/8) ),其中深度以位为单位。

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

【问题讨论】:

  • 听起来解决问题的关键是了解您正在处理的专有格式。除非您完全理解格式,否则您在读取 ​​16 位或 32 位图像时可能没有正确填充 imageBytes。这意味着问题可能发生在您发布的代码执行之前。如果您共享图像、您用于阅读图像的完整代码以及您获得的结果的屏幕截图,您可能能够在理解图像格式方面获得帮助。没有这些信息,我或其他任何人都无能为力。

标签: java image image-processing swt rgb


【解决方案1】:

根据您描述的症状,您可能遇到了字节序问题。看起来 Java 的 byte 数据类型是 8-bits only,因此当您构建 16 位图像时,总共两个 Java bytes 构成了构建图像中的一个像素。显然,对于 32 位图像,每个像素的 Java bytes 数量将是 4。

例如,在大端序的 32 位世界中,[0 0 0 255] 将是相当深的灰色(本质上是黑色)。另一方面,在 little-endian 世界中,它会非常接近白色。

一些问题:

  • 如何填充imageBytes 数组?
  • 它的尺寸是多少?如果depth 以位为单位,人们会假设它是width*height*depth/8

你可以尝试一些事情:

  • 阅读 SWT 文档以了解 ImageData 构造函数所期望的字节顺序
  • imageBytes 数组中的单个像素内随机排列bytes。例如,在 32 位情况下,[0 0 0 255] 变为 [255 0 0 0 ]

【讨论】:

    【解决方案2】:

    鉴于 (a) 您正在使用未知的图形格式和 (b) 您遇到灰色问题,我怀疑高位不是用于颜色,而是用于某些其他功能(可能是透明度/alpha)。这可以很容易地使预期的全黑图像变为 50% 灰度。

    尝试对每个图像字节(或 16 位或 ...)进行简单的位操作,并将高位设置为零。

    对于单个字节,即: finalByte = originalByte & 0x7f;

    该位也有可能是行程编码 (RLE) 或其他 varint 编码的标记,但如果您获得正确的图像大小/尺寸,则可能不是这种情况。

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多