Search code examples
javatransparencyimageicon

How to make drawn images transparent in Java


I got the animation to work in my Snake Clone Game. But the problem based on the picture is that the images do not have transparency(notice the white background of the circle pictures. Programming-wise, is there a fix to be able to include transparency to these drawn images?

Here's a picture containing my code and the output of the program.

enter image description here

P.S. On a side note, I decided to paste the direct link instead of the IMG code because I cannot seem to get it to display on StackOverFlow. I put an exclamation point in the front of the IMG code but it did not work so here's the direct link.


Solution

  • As the other answer mentioned, the easiest way would probably be to simply use PNG images which have a transparent background (you can create these with an image editor like GIMP). Alternatively, if you are limited to PNG images with a solid background, here's an example of how to change a given color (e.g. white) in the PNG to transparent:

    enter image description here

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