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()
TYPE_INT_RGB(值1)TYPE_3BYTE_BGR(值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。否则,您将不得不在此处放置其他东西。当然,您可以在转换之前检查原始图像是否已经具有正确的格式。
| 归档时间: |
|
| 查看次数: |
8218 次 |
| 最近记录: |