如何在Java中使绘制的图像透明

7
我已经在我的贪吃蛇克隆游戏中使动画正常工作。但是根据图片,问题在于这些图像没有透明度(请注意圆形图片的白色背景)。从编程角度来看,有没有办法修复这些绘制图像的透明度呢? 以下是包含我的代码和程序输出的图片。 P.S. 顺便说一下,我决定粘贴直接链接而不是IMG代码,因为我无法让它在StackOverFlow上显示。我在IMG代码前面放了一个感叹号,但它没有起作用,所以这是直接链接。

你的图片背景是透明的吗? - ntalbs
图像背景没有透明度。背景只需将JPanel的背景设置为Color.BLACK,如下所示:setBackground(Color.black)。 - Nicholas
1
提醒一下,发问题时不要在编辑器中截图代码,请将代码片段以文本形式放入问题描述中。 - searchengine27
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11

如其他答案所提到的,最简单的方法可能是使用具有透明背景的PNG图像(您可以使用像GIMP这样的图像编辑器创建这些图像)。或者,如果您只能使用具有纯色背景的PNG图像,则以下是将给定颜色(例如白色)更改为透明的示例:

输入图像描述

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;

public class SimpleFrame extends JFrame {
   JPanel mainPanel = new JPanel() {
      ImageIcon originalIcon = new ImageIcon("~/Pictures/apple.png");

      ImageFilter filter = new RGBImageFilter() {
         int transparentColor = Color.white.getRGB() | 0xFF000000;

         public final int filterRGB(int x, int y, int rgb) {
            if ((rgb | 0xFF000000) == transparentColor) {
               return 0x00FFFFFF & rgb;
            } else {
               return rgb;
            }
         }
      };

      ImageProducer filteredImgProd = new FilteredImageSource(originalIcon.getImage().getSource(), filter);
      Image transparentImg = Toolkit.getDefaultToolkit().createImage(filteredImgProd);

      public void paintComponent(Graphics g) {
         g.setColor(getBackground());
         g.fillRect(0, 0, getSize().width, getSize().height);

         // draw the original icon
         g.drawImage(originalIcon.getImage(), 100, 10, this);
         // draw the transparent icon
         g.drawImage(transparentImg, 140, 10, this);
      }
   };

   public SimpleFrame() {
      super("Transparency Example");

      JPanel content = (JPanel)getContentPane();
      mainPanel.setBackground(Color.black);
      content.add("Center", mainPanel);
   }

   public static void main(String[] argv) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            SimpleFrame c = new SimpleFrame();
            c.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            c.setSize(280,100);
            c.setVisible(true);
         }
      });
   }
}

我注意到你在变量名中使用了单个或两个字母。这种命名惯例仅适用于此示例吗? - Nicholas
我的变量命名在这里并不是很好,因为这只是一个例子。可以选择更具描述性的变量名称。 - 808sound
谢谢!这看起来是一个非常优雅的例子。就我个人而言,我所学的入门Java课程从未深入探讨您在示例中使用的Java类或图像透明度。我将研究您的示例。=] 感谢您提供的示例,808sound! - Nicholas
1
当然,很高兴能帮忙。顺便说一下,我编辑了代码,使其更易读。 - 808sound

4
不要使用画图工具来绘制你的图片。使用其他支持alpha通道的程序,比如Paint.net和Photoshop等。如果你一直使用圆形的话,可以使用g.drawOval(x, y, w, h)来绘制。

但问题在于,我需要为每个图像添加 alpha 通道。如果只使用 3 张图片,这是可以的。但是如果我的项目使用了很多图片,比如 1000 张图片,会发生什么呢? - Nicholas

2

像这样简单地使用类型转换为ARGB

BufferedImage image = new BufferedImage(
                 width, height,
                 BufferedImage.TYPE_INT_ARGB);

我希望它能够正常工作。


0
  public BufferedImage makeTransparentImage(BufferedImage br) {
    for (int i = 0; i < br.getHeight(); i++) {
        for (int j = 0; j < br.getWidth(); j++) {
            Color c = new Color(br.getRGB(j, i));
            int r = c.getRed();
            int b = c.getBlue();
            int g = c.getGreen();
            if ((r == 255 && b == 255 && g == 255)) {
                System.out.println("r g b " + r + g + b);
                br.setRGB(j, i, 0xFF000000);
            }
        }
    }
    return br;
}

不确定我是否使用错误,但是这对我没有用。 - Arefe

0
如果你要画一张简单的图片, 我知道最简单和最快的方法是... 在Macrosoft PowerPoint中画出图片,然后点击“另存为图片”以获得透明背景。接下来...
public class Node {
Image nodeImage[] = new Image[3];


public Node() {
    try {
        String address = "C:\\Users\\Desktop\\practice\\Simulation\\img\\";
        nodeImage[0] = ImageIO.read(new File(address + "Node_noVehicle.png"));
        nodeImage[1] = ImageIO.read(new File(address + "Node_setVehicle.png"));
        nodeImage[2] = ImageIO.read(new File(address + "Node_inVehicle.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
protected void paintComponent(Graphics g) {
  super.paintComponent(g);  
  Graphics2D g2dtemp = (Graphics2D) g.create();
  g2dtemp.drawImage(Node.nodeImage[0],(int)x,(int)y,width,height,this);
}

}

在Macrosoft PowerPoint中绘制图片,然后单击“另存为图片”以获取透明背景。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,