在缓冲图像上绘图时,RGB 颜色会随着包含 alpha 的变化而变化

Posted

技术标签:

【中文标题】在缓冲图像上绘图时,RGB 颜色会随着包含 alpha 的变化而变化【英文标题】:RGB colors changing on including alpha while drawing on Buffered Image 【发布时间】:2020-02-21 17:10:21 【问题描述】:

我正在尝试写一个缓冲图像并读回它的颜色。尽管 alpha 保持不变,但 RGB 颜色似乎发生了变化。我无法理解这背后的原因。任何有关解决此问题的帮助表示赞赏。我需要图像返回与我所写内容完全相同的颜色。

    try 
        BufferedImage img=new BufferedImage(256, 256,
                BufferedImage.TYPE_INT_ARGB);

        Graphics graphics =
                img.createGraphics();
        int r=45;int g=45; int b=100; int a=50;
        System.out.println("Red  "+r+"   Green "+g+"    Blue "+b+"   alpha "+a);

        graphics.setColor(new Color(r,g,b,a));
        graphics.fillRect(10,10, 40, 40);

        Integer i=img.getRGB(23,23);
        Color c=new Color(i,true);

        System.out.println("Going to read color back");
        System.out.println("Red  "+c.getRed()+"   Green "+c.getGreen()+"    Blue "+c.getBlue()+"   alpha "+c.getAlpha());

     catch (Exception e) 
        e.printStackTrace();
    

程序的输出: 红色 45 绿色 45 蓝色 100 阿尔法 50

要读回颜色

红46绿46蓝102阿尔法50

【问题讨论】:

当您使用 alpha 颜色填充矩形时,它会与背景颜色混合 背景没有颜色。你可以查看我的代码!我认为 BufferedImage.TYPE_INT_ARGB 有问题 你为什么需要这个???如果您想要精确的颜色,请改用数组!!! 我通过识别独特的颜色将数据存储在“地图图块”上。现在,如果我添加 alpha,我可以有 256*256*256*256 唯一颜色,因此可能是身份。 【参考方案1】:

如果您想保护源颜色,则应在使用 alpha 绘制任何图像之前添加以下代码。这解决了我的问题。

graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC));

Alpha Composite Doc Alpha Composite tutorial

【讨论】:

以上是关于在缓冲图像上绘图时,RGB 颜色会随着包含 alpha 的变化而变化的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 如何避免在具有 UIBezierPath 笔触颜色的相同颜色图像上绘图

OpenCV:如何为每个像素填充具有每种 RGB 颜色值的 rgb 图像?

从单独的线程在表单上绘制图像

在 MAC OS X 上渲染后,RGB 颜色显示为 BRG

如何使用 c++ 从 rgb 缓冲区调整图像大小

Android OpenGLES3绘图 - 帧缓冲