加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 将2种RGB颜色与Alpha结合使用

发布时间:2020-12-15 08:45:56 所属栏目:Java 来源:网络整理
导读:当我组合2种颜色时,我正在尝试(在 Java中)获得最终颜色,顶部的颜色具有alpha透明度.基本上,我正在尝试为图像指定背景颜色,但我已将其分解为每个单独更改的像素.我看过几篇文章,包括 this one,都没有用.有谁知道如何进行这种RGBA / RGB混色?我目前的代码使用
当我组合2种颜色时,我正在尝试(在 Java中)获得最终颜色,顶部的颜色具有alpha透明度.基本上,我正在尝试为图像指定背景颜色,但我已将其分解为每个单独更改的像素.我看过几篇文章,包括 this one,都没有用.有谁知道如何进行这种RGBA / RGB混色?我目前的代码使用这个png:

并生成这个JPG:

这是我目前正在使用的功能.演示图像的背景设置为全蓝色或int为255.

public static void PNGToJPEGConvert(String PNGPath,String NewJPEGPath,int BackColor) throws IOException {
    try {
        BufferedImage bufferedImage = ImageIO.read(new File(PNGPath));
        BufferedImage newImage;
        int R1,G1,B1,R2 = (BackColor & 0xFF0000) >> 16,G2 = (BackColor & 0xFF00) >> 8,B2 = (BackColor & 0xFF),W1,W2,W3,M1,M2,R3,G3,B3;
        float br;
        newImage = new BufferedImage(bufferedImage.getWidth(),bufferedImage.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);
        for(int x=0; x < bufferedImage.getWidth(); x++) {
            for(int y=0; y < bufferedImage.getHeight(); y++) {
                R1 = BufferedImageGetPixelARGB(bufferedImage,"R",x,y);
                G1 = BufferedImageGetPixelARGB(bufferedImage,"G",y);
                B1 = BufferedImageGetPixelARGB(bufferedImage,"B",y);
                W1 = Math.min(R1,Math.min(G1,B1));
                W2 = Math.min(R2,Math.min(G2,B2));
                R1 -= W1;
                G1 -= W1;
                B1 -= W1;
                R2 -= W2;
                G2 -= W2;
                M1 = Math.max(R1,Math.max(G1,B1));
                M2 = Math.max(R2,Math.max(G2,B2));
                br = (M1 + M2)/(2*BufferedImageGetPixelARGB(bufferedImage,"A",y));
                R3 = (int) ((R1 + R2) * br);
                G3 = (int) ((G1 + G2) * br);
                B3 = (int) ((B1 + B2) * br);
                W3 = (W1 + W2) / 2;
                R3 += W3;
                G3 += W3;
                B3 += W3;
                newImage.setRGB(x,y,RGBValuesToInt(R3,B3));
            }
        }
        try {
            ImageIO.write(newImage,"jpg",new File(NewJPEGPath));
        } catch(Exception e) {

        }
    } catch(Exception e) {

    }
}

谢谢您的帮助,
-Neil

解决方法

基本上是

float masking_factor = mask_value/255.0;
composed_value = int(
    source_pixel_value * (1 - masking_factor) + 
    overlay_pixel_value * masking_factor
);

我们假设所有值都是8位,即0到255,并且掩码是单色的.掩模完全是黑色的,它是完全透明的,只有源像素可见.如果蒙版是完全白色的,则它是完全不透明的,只有覆盖像素可见.中间的值给出中间不透明度.

但是如果你想要实现alpha混合是唯一的,那么有更好的方法来处理单个像素.请参见Graphics2D及其.setComposite()方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读