我试图弄清楚如何检测具有Alpha通道的PNG是否不透明。如果它是不透明的,则所有像素都具有100%的透明度通道,因此应该可以转换为不支持透明度的JPEG之类的格式。
[This answer显示如何检测Alpha通道,但如果图像不透明则不显示。
ImageMagick can apparently do it与-format %[opaque]
,但我希望能够用纯Java做到这一点。
您知道是否可以使用ImageIO执行这种不透明检测?
可能的情况是使用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;
}
}
是对源的引用。