在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)
答案 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}}。但它需要更多的代码来读取部分。