用alpha通道改变图像的对比度会导致黄色色调

时间:2018-01-25 21:50:24

标签: java image image-processing awt

我正在尝试使用BufferedImage调整RescaleOp的对比度。在没有Alpha通道的情况下更改图像的对比度可以正常工作,但对于具有Alpha通道的图像,它会创建黄色色调;我做错了什么?

为了验证问题是由于alpha通道我将原始文件加载到Gimp中,添加了一个alpha通道,然后将文件导出到另一个png图像,这产生了第二个图像我试图改变对比度。 / p>

public class Test
{

    public static void main(String[] args) throws IOException
    {
        changeContrast(new File("contrast/base_image_without_alpha.png"), 
                       new File("contrast/output_without_alpha.png"));
        changeContrast(new File("contrast/base_image_with_alpha.png"), 
                       new File("contrast/output_with_alpha.png"));
    }

    private static void changeContrast(File sourceImageFile, File targetImageFile) throws IOException
    {
        BufferedImage image = ImageIO.read(sourceImageFile);

        RescaleOp rescaleOp = new RescaleOp(1.8f, 0, null);
        rescaleOp.filter(image, image);

        ImageIO.write(image, "png", targetImageFile);
    }

}

base_image: base_image

output_without_alpha: output_without_alpha

output_with_alpha: output_with_alpha

为自己尝试的图片:http://www.mediafire.com/file/15r1zh27ccjj1w1/contrast.zip

MCVE为自己尝试(轻松

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;

public class TestAlphaRescale {

    public static void main(String[] args) throws Exception {

        File f = new File("output_without_alpha.png");
        URL url = new URL("https://i.stack.imgur.com/S3m9W.jpg");
        Desktop desktop = Desktop.getDesktop();
        changeContrast(url,f);
        desktop.open(f);
        desktop.browse(url.toURI());

        f = new File("output_with_alpha.png");
        // with alpha
        url = new URL("https://i.stack.imgur.com/memI0.png");
        changeContrast(url,f);
        desktop.open(f);
        desktop.browse(url.toURI());
    }

    private static void changeContrast(URL sourceImageURL, File targetImageFile) throws IOException {
        BufferedImage image = ImageIO.read(sourceImageURL);

        RescaleOp rescaleOp = new RescaleOp(1.8f, 0, null);
        rescaleOp.filter(image, image);

        ImageIO.write(image, "png", targetImageFile);
    }
}

1 个答案:

答案 0 :(得分:0)

我通过更新到Java 9修复了这个问题。

这似乎是Java 8中的一个错误,现在已经在Java 9中修复了。我最初使用JDK1.8.0_144并收到黄色调,我现在使用JDK-9.0.4并且不再有问题。现在,无论有没有alpha通道,图像看起来都一样。