Java 中的 BufferedImage 和 ColorModel

pls*_*spl 2 java image-manipulation image image-processing

我在java中使用图像处理库来操作图像。我做的第一步是读取图像并创建java.awt.Image.BufferedImage对象。我是这样做的,

BufferedImage sourceImage = ImageIO.read( new File( filePath ) );
Run Code Online (Sandbox Code Playgroud)

上面的代码创建了一个BufferedImage对象DirectColorModel

rmask=ff0000
gmask=ff00
bmask=ff
amask=0。

这就是我在 macbook 上运行上述代码时发生的情况。

但是当我在 linux 机器(托管服务器)上运行相同的代码时,这会创建一个BufferedImage对象ColorModel

pixelBits = 24
numComponents = 3
颜色空间 = java.awt.color.ICC_ColorSpace@c39a20
透明度 = 1 有 alpha = false
isAlphaPre = false。

我在这两种情况下都使用了相同的 jpg 图像。我不知道为什么ColorModel在 mac 和 linux 上运行时相同的图像是不同的。在ColorModel用于MAC有4个部件和用于Linux的ColorModel的具有3个分量。

因此出现了一个问题,我使用的图像处理库总是假设传递的图像的ColorModel中总是有4个组件,并且在linux box上运行时它会抛出一个数组越界异常。但是在 macbook 上,它运行良好。

添加更多信息,读取图像后,我打印出来 image.getType()

  • 在 mac -> 它返回TYPE_INT_RGB(值1
  • 在 linux -> 它返回TYPE_3BYTE_BGR(值5

我不确定是我做错了什么还是图书馆有问题。请让我知道你的想法。如果我不明白,也可以问我任何问题!

Mic*_*mer 5

我不知道为什么你会得到两种不同颜色的模型,尽管我相信它们是完全相同的。DirectColorModel 有 4 个组件,但 alpha 掩码为 0,因此实际上它只有 3 个组件,就像另一个组件一样。

我建议编写一个简单的辅助函数,以确保在将图像传递给此图像库之前,图像具有正确的颜色模型。辅助函数可以使用http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/ColorConvertOp.html或使用类似下面的代码(未经测试):

私有静态 BufferedImage makeCompatible(BufferedImage 图像){
  int w = image.getWidth();
  int h = image.getHeight();

  BufferedImage result = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
  Graphics2D g = result.createGraphics();
  g.drawRenderedImage(image, new AffineTransform()); //或其他一些drawImage函数
  g.dispose();

  返回结果;
}

假设库能够处理 BufferedImage.TYPE_4BYTE_ABGR。否则,您将不得不在此处放置其他东西。当然,您可以在转换之前检查原始图像是否已经具有正确的格式。