2012-12-31 3 views
4

뱀 복제 게임에서 작동하는 애니메이션이 있습니다. 그러나 그림을 기반으로 한 문제는 이미지에 투명도가 없다는 것입니다 (원형 그림의 흰색 배경에 주목하십시오.) 프로그래밍 방식으로 그려진 이미지에 투명도를 포함 할 수 있습니까?Java에서 그려진 이미지를 투명하게 만드는 방법

사진을 내 코드와 프로그램의 출력을 포함. 보조 노트에

enter image description here

PS, 나는 나는 그것이 유래에 표시 얻이 수없는 것 때문에 IMG 코드 대신 직접 링크를 붙여 넣기로 결정했다. IMG 코드 앞에 느낌표를 넣었지만 작동하지 않아 직접 링크가 있습니다.

+0

이미지의 배경이 투명합니까? – ntalbs

+0

이미지 배경에 투명도가 없습니다. 배경은 단순히 JPanel의 배경을 Color.BLACK으로 설정하는 것입니다 : setBackground (Color.black) – Nicholas

답변

7

다른 대답이 언급 된 것처럼 가장 쉬운 방법은 단순히 투명한 배경을 가진 PNG 이미지를 사용하는 것입니다 (김프와 같은 이미지 편집기로 만들 수 있습니다). 간단한

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

변수 이름에 하나 또는 두 개의 문자를 사용했음을 알았습니다. 주어진 예제에 대해서만이 명명 규칙을 사용합니까? – Nicholas

+0

변수 이름 지정은 여기에 그다지 좋지 않습니다. 보다 기술적 인 변수 이름을 선택할 수 있습니다. – 808sound

+0

감사합니다. 정말 우아한 예입니다. 개인적으로, 내가 소개 한 Java 클래스는 예제 나 이미지 투명성에서 사용한 Java 클래스에 대해 결코 파묻지 않았다. 나는 너의 모범을 살펴볼 것이다. =] 주어진 예제, 808sound에 감사드립니다! – Nicholas

4

그림을 그리는 데 페인트를 사용하지 마십시오. Paint.net이나 Photoshop과 같은 알파를 사용하는 다른 프로그램을 사용하십시오 ... 영원히 원을 사용한다면 g.drawOval (x, y, w, h)을 사용할 수 있습니다.

+0

하지만 모든 단일 이미지에 알파 채널을 추가해야한다는 문제가 있습니다. 방금 사진을 3 장 사용하면 괜찮습니다. 그러나 프로젝트에서 1000 개의 이미지와 같은 많은 그림을 사용한다면 어떻게됩니까? – Nicholas

1
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; 
} 
-2

: 당신은 단색 배경으로 PNG 이미지로 제한하는 경우 또는, 여기에 투명하게 PNG에서 특정 색상 (예 : 흰색)을 변경하는 방법의 예 이런 형식의 ARGB에 유형을 사용하십시오.

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

희망합니다.