BufferedImage& Java中的ColorModel

时间:2010-04-08 06:03:24

标签: java image image-processing image-manipulation

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

BufferedImage sourceImage = ImageIO.read( new File( filePath ) );

以上代码使用BufferedImage创建DirectColorModel对象:

  

rmask = FF0000
  的GMask = FF00
  bmask = FF
  AMASK = 0。

当我在我的macbook上运行上面的代码时会发生这种情况。

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

  

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

我在两种情况下使用相同的jpg图像。我不知道为什么在mac和linux上运行时同一图像的ColorModel会有所不同。 mac的ColorModel有4个组件,linux的colormodel有3个组件。

由于这个原因,出现了一个问题,我使用的图像处理库总是假设传递的图像的ColorModel中总有4个组件,并且当在linux盒子上运行时它会抛出一个数组超出范围的异常。但是在macbook上,它运行良好。

添加更多信息,阅读完图片后,我打印出image.getType()

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

我不确定我做错了什么或者库有问题。请让我知道你的想法。如果我没有意义,也请问我任何问题!

2 个答案:

答案 0 :(得分:4)

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

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

private static BufferedImage makeCompatible(BufferedImage image) {
  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()); //or some other drawImage function
  g.dispose();

  return result;
}

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

答案 1 :(得分:0)

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

  • 在Mac上 - >它返回TYPE_INT_RGB(值为1)
  • 在linux上 - >它返回TYPE_3BYTE_BGR(值为5)