【发布时间】:2011-02-05 13:45:55
【问题描述】:
我正在使用 java 中的图像处理库来处理图像。我要做的第一步是读取图像并创建一个java.awt.Image.BufferedImage 对象。我是这样做的,
BufferedImage sourceImage = ImageIO.read( new File( filePath ) );
上面的代码用DirectColorModel创建了一个BufferedImage对象:
rmask=ff0000
gmask=ff00
bmask=ff
掩码=0。
当我在我的 macbook 上运行上述代码时会发生这种情况。
但是当我在 linux 机器(托管服务器)上运行相同的代码时,这会创建一个带有 ColorModel 的 BufferedImage 对象:
pixelBits = 24
numComponents = 3
颜色空间 = java.awt.color.ICC_ColorSpace@c39a20
透明度 = 1 有 alpha = false
isAlphaPre = false。
我在这两种情况下都使用了相同的 jpg 图像。不知道为什么同一张图片的ColorModel在mac和linux上运行时不一样。 mac 的ColorModel 有 4 个组件,linux 的 colormodel 有 3 个组件。
因此产生了一个问题,我使用的图像处理库总是假设传递的图像的ColorModel中总是有4个组件,并且在linux机器上运行时会抛出一个数组越界异常.但在 macbook 上,它运行良好。
添加更多信息,读取图像后,我打印出image.getType()
- 在 mac -> 它返回
TYPE_INT_RGB(1的值) - 在 linux 上 -> 它返回
TYPE_3BYTE_BGR(5的值)
我不确定是我做错了什么还是图书馆有问题。请让我知道你的想法。如果我没有任何意义,也可以问我任何问题!
【问题讨论】:
-
听起来像是库中的错误。它不应该对从
ImageIO.read返回的图像的ColorModel做出假设。 -
这很可能取决于所使用的 Linux 版本和图形堆栈。对于具有合成支持的更现代的图形堆栈,它们将具有 alpha 通道。然而,正如DirectColorModel 所说,有些项目是最终的,因为 JVM 需要与操作系统/图形堆栈互操作才能实际显示内容。 OPs Linux 系统使用 3 字节 RGB 来节省内存;如果您转换模式(
xrandr等),它将转到另一个值,所以最好的办法是转换为您想要的模型。
标签: java image image-processing image-manipulation