Java 制作图像';在RGBA中使用alpha设置不透明度

Java 制作图像';在RGBA中使用alpha设置不透明度,java,image,opacity,rgb,rgba,Java,Image,Opacity,Rgb,Rgba,我试着制作一个简单的程序,加载一个图像,使其产生蓝色效果,并且使其半透明。我通过在图像像素上运行并更改RGB的蓝色值和alpha值来实现这一点。我成功地为图像制作了一个漂亮的蓝色效果。但是我无法改变图像的不透明度。似乎无论我如何改变像素的alpha值,它都不会影响图像 这是我的密码: try { image1 = ImageIO.read(new File("image1.png")); } catch(IOException e) {e.printStackTrace();} fo

我试着制作一个简单的程序,加载一个图像,使其产生蓝色效果,并且使其半透明。我通过在图像像素上运行并更改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());
    }
}
试试看{
image1=ImageIO.read(新文件(“image1.png”);
}catch(IOE异常){e.printStackTrace();}

对于(int x=0;x,
Color
构造函数只接受一个
int
创建一个不透明的颜色(使用alpha 255)。当您使用
getAlpha()
再次取出alpha时,这里的值总是255

第413行的相关Java
Color
code(至少在Java 1.7中):

设置了最重要的8个字节,覆盖了所有alpha分量

要保留alpha分量,需要使用的值为
int
,是否有alpha分量为
boolean

Color color = new Color(rgb, true);
使用一个:

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

你能展示一下你用来定义image1的代码吗?那么这个构造器的意思是什么:颜色(r,g,b,a);我什么时候需要使用它?颜色构造器需要4个整数——单个组件红色、绿色、蓝色和alpha,从0到255。这与构造器需要4个浮点数——单个组件红色、绿色、蓝色和alpha,作为小数从0.0到1.0。setRGB在幕后使用颜色吗?我更新了我无法理解如何使用你的代码。因为我只使用颜色来将rbg int分解到它的各个部分,无法理解颜色对象如何直接影响我的图像
Color color = new Color(rgb, true);
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 = 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));
...