我试图用alpha通道保存PNG图像,但在进行了一些按像素操作并保存之后,alpha通道在每个像素上都恢复到255。继承我的代码:
首先进行像素操作:
public BufferedImage apply(BufferedImage image) {
int pixel;
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
pixel = image.getRGB(x, y);
if (threshold < getAverageRGBfromPixel(pixel)) {
image.setRGB(x, y, new Color(0f, 0f, 0f, 0f).getRGB());
}
}
}
return image;
}
注意:应该是透明的像素是黑色的,所以我绝对会击中它们。
并且说明了保存的代码。
@Test
public void testGrayscaleFilter() {
ThresholdFilter thresholdFilter = new ThresholdFilter();
testImage = thresholdFilter.apply(testImage);
File outputFile = new File(TEST_DIR + "/testGrayPicture" + ".png");
try {
// retrieve image
ImageIO.write(testImage, "png", outputFile);
} catch (IOException e) {
}
谁能告诉我我做错了什么?
答案 0 :(得分:1)
通过查看BufferedImage类的文档,它不会写入alpha通道的唯一原因是原始BufferedImage对象的类型是TYPE_INT_RGB而不是TYPE_INT_ARGB。
一种解决方案是创建一个具有相同高度和宽度但类型为TYPE_INT_ARGB的新BufferedImage对象,当您更改像素数据时,使用else语句将其复制。
public BufferedImage apply(BufferedImage image) {
int pixel;
BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
pixel = image.getRGB(x, y);
if (threshold < getAverageRGBfromPixel(pixel)) {
newImage.setRGB(x, y, new Color(0f, 0f, 0f, 0f).getRGB());
}
else {
// Not sure about this line
newImage.setRGB(x, y, pixel);
}
}
}
return image;
}
答案 1 :(得分:-1)
当您将其保存为PNG24时,PNG不支持Alpha通道,仅支持Alpha透明度。