hasAlpha vs getAlphaRaster

时间:2013-12-06 15:59:00

标签: java image awt

在Java中,是否可以使BufferedImage getColorModel().hasAlpha()返回true,但getAlphaRaster()将返回null?

我问,因为有一个我正在使用的图书馆(特别是在PDJpeg班级的PDF文件)打破了这样的图像。

在这种特殊情况下,我使用:

非常简单地创建图像
BufferedImage bi = ImageIO.read(new FileInputStream("/Users/dan/Downloads/test.png"));

我已经在这个问题下附上了我失败的特定形象。

我可以将某些参数传递给ImageIO,或者在我加载BufferedImage之后我可以对其进行某种转换,以便它不会遇到此问题吗?

如果重要的话,我正在运行Java 1.7.0_40。

完整性的堆栈跟踪:

java.lang.NullPointerException
    at java.awt.image.ComponentColorModel.isCompatibleRaster(ComponentColorModel.java:2787)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:629)
    at org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg.createImageStream(PDJpeg.java:159)
    at org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg.<init>(PDJpeg.java:133)

enter image description here

1 个答案:

答案 0 :(得分:1)

是。正如JavaDoc所述:

  

此方法假定对于ColorModel以外的所有IndexColorModel个对象,如果ColorModel支持alpha,则会有一个单独的Alpha通道存储为最后一个图像数据带。如果图像使用查找表中包含alpha的IndexColorModel,则此方法返回null,因为没有空间离散的Alpha通道。

您的图片是具有透明索引的调色板PNG。 ImageIO会将此内容读入带有BufferedImage的{​​{1}}(即没有离散的Alpha通道)。

您可以将图片转换为其他IndexColorModel类型(如BufferedImage),方法是创建相同大小的空白图片,获取图片并将原始图片绘制到其上:

TYPE_INT_RGB

您也可以将图片类型作为BufferedImage origininal = ...; BufferedImage copy = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = copy.createGraphics(); try { g.drawImage(original, 0, 0, null); } finally { g.dispose(); } 传递给传递给ImageTypeSpecifier的{​​{1}}。但它需要更多的代码来读取部分。