使用java swing.image更改透明度的方法

使用java swing.image更改透明度的方法,java,swing,graphics,Java,Swing,Graphics,我用这种方法在框架中绘制图形 public void paint(Graphics g) { screenImage = createImage(1280, 720); screenGraphic = screenImage.getGraphics(); screenDraw((Graphics2D) screenGraphic); //g.drawImage(BG, 0, 0, null); g.drawImage(screenImage, 0

我用这种方法在框架中绘制图形

public void paint(Graphics g) {  
    screenImage = createImage(1280, 720); 
    screenGraphic = screenImage.getGraphics(); 
    screenDraw((Graphics2D) screenGraphic); 
    //g.drawImage(BG, 0, 0, null);
    g.drawImage(screenImage, 0, 0, null);
}

public void screenDraw(Graphics2D g) {
    g.drawImage(BG, 0, 0, null); 
    Graphics2D g2 = (Graphics2D)g;
    if(isMainScreen) {
        //g2.setComposite(alphaComposite);
        g2.drawImage(selectedImage, 100, 220, null);
    }
    paintComponents(g);
    this.repaint();  
}
我想选择透明度为50%或其他整数的图像

private Image selectedImage = new ImageIcon(Main.class.getResource("../pic/something.jpg")).getImage(); 
这是selectedImage,效果很好。

修改一些代码,然后可以将每个像素设置为透明

Image selectedImage = new ImageIcon([...]).getImage();

//Image -> BufferedImage code
BufferedImage img = new BufferedImage(selectedImage.getWidth(null), selectedImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
g.drawImage(selectedImage, 0, 0, null);
g.dispose();

//set each pixel to be transparent
int transparency = 127; //0-255, 0 is invisible, 255 is opaque
int colorMask = 0x00FFFFFF; //AARRGGBB
int alphaShift = 24;
for(int y = 0; y < img.getHeight(); y++)
    for(int x = 0; x < img.getWidth(); x++)
        img.setRGB(x, y, (img.getRGB(x, y) & colorMask) | (transparency << alphaShift));

//img is now transparent, can replace selectedImage if you want (optional)
selectedImage = img;

如果您使用而不是ImageIcon.getImage,它将直接为您提供一个BuffereImage

Change Graphics2D g=img.createGraphics;g、 drawImageselectedImage,0,0,空;到Graphics2D g=img.createGraphics;复合c=AlphaComposite.getInstance AlphaComposite.SRC_,.5f;g、 setCompositec;g、 drawImageselectedImage,0,0,空;工作完成了@AndrewThompson Neat,我确信有办法修改图纸,但不确定使用什么。如果我没记错的话,JFrame.paintGraphics实际上是一个Graphics2D对象,合成可以临时应用于该对象?是的,只要图形被转换为Graphics2D对象,或者以其他方式创建为Graphics2D对象。但不要改变顶级容器的涂漆方法。在JPanel中进行自定义绘制,我创建了一个名为public Image changedImageAlphaImage Image,int trans的方法,并使用了完全相同的代码,而不是selectedImage=img,返回img;在screenDraw方法中,我将ifisMainScreen中的代码重写为g.DrawImageChangeDimageAlphaSelectedImage120100220,null;,它清楚地向我展示了一个透明的图像,但上面什么也没有。这只是一个清晰透明的图像。我做错了什么?如果有助于解决问题,请回答。还可以重新访问您的一些应用程序,并执行相同的操作!