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

时间:2013-04-22 20:43:16

标签: java image opacity rgb rgba

我尝试制作一个简单的程序来加载图像,使其成为蓝色效果,并使其变为半透明。我是通过运行图像像素并更改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);
    }
}

2 个答案:

答案 0 :(得分: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));
...

答案 1 :(得分:0)

只占Color的{​​{1}}构造函数会创建一个不透明的颜色(使用alpha 255)。当您使用int再次取出alpha时,此处始终为255。

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

Color

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

要保留alpha分量,您需要使用public Color(int rgb) { value = 0xff000000 | rgb; } int来获取值 a boolean,以确定它是否具有alpha值成分

Color color = new Color(rgb, true);