Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用alpha通道更改图像对比度会导致黄色_Java_Image_Image Processing_Awt - Fatal编程技术网

Java 使用alpha通道更改图像对比度会导致黄色

Java 使用alpha通道更改图像对比度会导致黄色,java,image,image-processing,awt,Java,Image,Image Processing,Awt,我正在尝试使用RescaleOp调整buffereImage的对比度。更改没有alpha通道的图像的对比度效果很好,但对于具有alpha通道的图像,它会创建黄色色调;我做错了什么 为了验证问题是否是由于alpha通道引起的,我将原始文件加载到Gimp中,添加了一个alpha通道,然后将文件导出到另一个png图像,这生成了我尝试更改其对比度的第二个图像 public class Test { public static void main(String[] args) throws IO

我正在尝试使用
RescaleOp
调整
buffereImage
的对比度。更改没有alpha通道的图像的对比度效果很好,但对于具有alpha通道的图像,它会创建黄色色调;我做错了什么

为了验证问题是否是由于alpha通道引起的,我将原始文件加载到Gimp中,添加了一个alpha通道,然后将文件导出到另一个png图像,这生成了我尝试更改其对比度的第二个图像

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);
    }

}
基本图像:

不带α的输出α:

输出带有α的α:

要自己尝试的图像:

MCVE自己尝试一下(轻松地


我通过更新到Java9解决了这个问题


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

RGBA与ARGB之间是否存在问题?Javadoc中的“缩放常量集的数量可能是一个,在这种情况下,相同的常量应用于所有颜色(但不是alpha)组件”。如果您的图像是ARGB,但Java代码将其解释为RGBA,那么您应用的缩放将使A、R和G增加1.8倍,而不使用蓝色,这将产生您所看到的效果。不作为答案发布,因为尽管我作为摄影师和Lightroom用户对颜色很了解,但我不是AWT图形专家。我在我的系统(Java 9、Windows 7.1、Eclipse Oxygen)上运行了您的代码,但无法重现您的问题。带有α.png的
output_文件与不带α.png的
output_文件看起来相同。您的系统上正在发生其他情况。使用我编辑到问题中的源代码,您是否看到相同的行为?这是一个-请在将来发布一个。它使用您的原始“无alpha”图像以及带有来自的棋子alpha的PNG。像@JimGarrison,我在这里没有看到问题。@AndrewThompson我运行了您在我的系统上提供的代码,并且在alpha棋子上遇到了相同的问题:似乎这是我的系统特有的问题。我会尝试进一步调试这个问题,如果我找到解决方案,我会向你汇报。很高兴你把它整理好了。请在将来发布MCVE,因为它使其他人更容易测试,并能更快地得到答案。哦,请给测试类指定特定的名称,比如
TestAlphaRescale
,而不仅仅是
test
。我在IDE中只保留一个包来测试其他人的代码,短的泛型名称会导致冲突。
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);
    }
}