使用 RGBA 中的 alpha 使图像不透明度

Posted

技术标签:

【中文标题】使用 RGBA 中的 alpha 使图像不透明度【英文标题】:Make image's opacity using alpha in RGBA 【发布时间】:2013-04-15 21:35:57 【问题描述】:

我尝试制作一个简单的程序来加载图像,使其具有蓝色效果,并使其半透明。我通过在图像像素上运行并更改 RGB 的蓝色值和 alpha 值来做到这一点。我成功地为图像制作了漂亮的蓝色效果。但我无法改变图像的不透明度。看来无论我如何改变像素的alpha值,它都不会影响图像。

这是我的代码:

try 
    image1 = ImageIO.read(new File("image1.png"));
 catch(IOException e) e.printStackTrace();


for(int x=0;x<image1.getWidth();x++) 
    for(int y=0;y<image1.getHeight();y++) 
        int rgb = image1.getRGB(x, y);
        Color color = new Color(rgb);
        int r = color.getRed();
        int g = color.getGreen();
        int b = color.getBlue();
        int a = color.getAlpha();

        System.out.println(a);
        a= 100;
        if(b<155)
            b+=100;
        else
            b=255;

        color = new Color(r,g,b,a);

        image1.setRGB(x, y, color.getRGB());
    

更新: 我也试过这个。还是不行:

for(int x=0;x<image1.getWidth();x++) 
    for(int y=0;y<image1.getHeight();y++) 
        int rgb = image1.getRGB(x, y);
        Color color = new Color(rgb,true);
        int r = color.getRed();
        int g = color.getGreen();
        int b = color.getBlue();
        int a = color.getAlpha();

        a= 100;
        if(b<155)
            b+=100;
        else
            b=255;


        rgb = rgb | b;
        rgb = rgb & 0x33ffffff;


        image1.setRGB(x, y, rgb);
    

【问题讨论】:

你能展示你用来定义image1的代码吗? 【参考方案1】:

使用AlphaComposite:

BufferedImage img = //some code here
BufferedImage imgClone = //some clone of img, but let its type be BufferedImage.TYPE_INT_ARGB
Graphics2D imgCloneG = imgClone.createGraphics();
imgCloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
imgCloneG.drawImage(img, 0, 0, null);
//imgClone is now img at half alpha

imgClone 可以这样写:

...
imgClone = new BufferedImage(img.getWidth(), img.getHeight(), 
                             BufferedImage.TYPE_INT_ARGB);
Graphics2D imgCloneG = imgClone.createGraphics();
imgCloneG.drawImage(img, 0, 0, null);
imgCloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f));
...

【讨论】:

【参考方案2】:

仅采用intColor 构造函数会创建不透明的颜色(alpha 为255)。当你用getAlpha() 再次取出 alpha 时,这里总是 255。

相关的 Java Color 代码,来自第 413 行(至少在 Java 1.7 中):

public Color(int rgb) 
    value = 0xff000000 | rgb;

设置最重要的 8 个字节,覆盖那里的任何 alpha 组件。

要保留 alpha 分量,您需要使用Color constructor,它接受一个int 的值一个boolean 来判断它是否有一个alpha 分量。

Color color = new Color(rgb, true);

【讨论】:

那么这个构造函数是什么意思:Color(r,g,b,a);我什么时候需要使用它? 采用 4 个整数的 Color 构造函数——红色、绿色、蓝色和 alpha 的各个分量,范围为 0-255。请不要将这与采用 4 个浮点数的构造函数混淆 - 单个组件红色、绿色、蓝色和 alpha,作为从 0.0 到 1.0 的小数。 setRGB 是在幕后使用 Color 吗?我更新了代码,但它仍然不起作用。我无法理解如何使用您的代码。因为我只使用 Color 将 rbg int 分解为它的部分,并且无法弄清楚 Color 对象如何直接影响我的图像

以上是关于使用 RGBA 中的 alpha 使图像不透明度的主要内容,如果未能解决你的问题,请参考以下文章

alpha值的问题

第十九节-opacity与visibility

用jquery改变rgba alpha透明度[重复]

CSS3 rgba用法

如何使用 Qt3D 在网格中制作透明线?

透明居然可以透部分背景色过来