我在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()
TYPE_INT_RGB
(值1
)TYPE_3BYTE_BGR
(值5
)我不确定我做错了什么或者库有问题。请让我知道你的想法。如果我没有意义,也请问我任何问题!
答案 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()