Java ImageIO:检查带有alpha的PNG是否不透明?

问题描述 投票:0回答:1

我试图弄清楚如何检测具有Alpha通道的PNG是否不透明。如果它是不透明的,则所有像素都具有100%的透明度通道,因此应该可以转换为不支持透明度的JPEG之类的格式。

[This answer显示如何检测Alpha通道,但如果图像不透明则不显示。

ImageMagick can apparently do it-format %[opaque],但我希望能够用纯Java做到这一点。

您知道是否可以使用ImageIO执行这种不透明检测?

java javax.imageio
1个回答
0
投票

可能的情况是使用BufferedImage#getData并用蛮力遍历所有像素并检查其alpha。如果一个像素不具有alpha BufferedImage#getData,则图像不是不透明的。 1.0可以找到一个很好的how示例,但是可以直接使用Here而不是先获取BufferedImage

Raster

NOTE:这不是我的工作。我添加了代码,使答案独立于链接。 import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class DetectImageTransparency { public static void main(String... args) throws IOException { File pngInput = new File("/tmp/duke.png"); BufferedImage pngImage = ImageIO.read(pngInput); checkTransparency(pngImage); File jpgInput = new File("/tmp/duke.jpg"); BufferedImage jpgImage = ImageIO.read(jpgInput); checkTransparency(jpgImage); } private static void checkTransparency(BufferedImage image){ if (containsAlphaChannel(image)){ System.out.println("image contains alpha channel"); } else { System.out.println("image does NOT contain alpha channel"); } if (containsTransparency(image)){ System.out.println("image contains transparency"); } else { System.out.println("Image does NOT contain transparency"); } } private static boolean containsAlphaChannel(BufferedImage image){ return image.getColorModel().hasAlpha(); } private static boolean containsTransparency(BufferedImage image){ for (int i = 0; i < image.getHeight(); i++) { for (int j = 0; j < image.getWidth(); j++) { if (isTransparent(image, j, i)){ return true; } } } return false; } public static boolean isTransparent(BufferedImage image, int x, int y ) { int pixel = image.getRGB(x,y); return (pixel>>24) == 0x00; } } 是对源的引用。

© www.soinside.com 2019 - 2024. All rights reserved.