2014-05-15 7 views
1

버퍼링 된 이미지 (원형 유형)을 만들어야하지만 사각형 유형 만 만들 수 있습니다. 그런 다음 몇 가지 구성으로 버퍼 이미지 내부에 타원형을 만들고 싶습니다. 마지막으로 직사각형 아이콘을 원형에 삽입하고 원형 모양에 삽입해야하며 사각형 버퍼 이미지에는 삽입하지 말아야합니다. 지금 내가 할 수 오전 다음그래픽을 사용하여 Java에서 직사각형을 만드는 대신 순환 버퍼링 된 이미지를 만드는 방법

BufferedImage img = "SomeImage.png"; 
BufferedImage bfImage = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB); 
Graphics2D graphics  = bfImage.createGraphics(); 
graphics.fillOval(0, 0, 200, 200); 
graphics.drawImage(img, 0, 0, null); 

(이것은 bfImage 개체 내부 원형, 타원형을 생성) 가 지금은 100 * 100 사이즈를 말한다의 직사각형은 "IMG"을 그릴 필요가있다. 이 그림을 사용하여 그릴 수 있습니다. 내가 이것을 할 때 내 최종 이미지는 직사각형 BfImage에 그려지는데 원하는 것은 없습니다. 이미지 "img"가 원형 타원형으로 그려지기를 원합니다. 경계 밖으로 나오지 않아야합니다. 원형 타원형의 직사각형 bfImage에서 마지막 이미지를 그리는 대신에 이미지를 직접 그릴 수있는 원형 bfImage를 가질 수 있습니다. 그래픽을 사용하여 Java2D에서이를 수행하는 모든 논리.

답변

2

이 아니며 직사각형 형태의 인 2 차원 배열의 의미에서 "원형 이미지"를 본 적이 결코 없습니다. 원 밖에있는 픽셀을 볼 수 없다고 염려하는 경우 해당 픽셀에 대해 알파를 0으로 설정하면됩니다. 이렇게하는 쉬운 방법은 ARGB (0,0,0,0)로 전체 사각형 이미지를 채운 다음 원하는 것을 그립니다.

또한이 버퍼를 이미지 파일로 유지하려는 경우 투명성을 지원하는 PNG 또는 TIFF와 같은 형식으로 내보내거나 저장해야합니다.

1

@justinzane이 말했듯이 진정한 원형 이미지를 가질 수 없습니다. 모든 BufferedImage은 직사각형입니다.

하지만 AlphaComposite 클래스와 AlphaComposite.SrcIn 클래스를 사용하면 효과를 얻을 수 있습니다. 아래 예제와 같이 완전히 실행되는 예제를 추가했습니다. compose 메서드가 중요한 부분입니다.

Screen shot, showing how a template + image = image inside template

public class AlphaCompositeTest { 
    private static BufferedImage compose(final BufferedImage source, int w, int h) { 
     BufferedImage destination = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D graphics = destination.createGraphics(); 
     try { 
      graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      graphics.setColor(Color.BLACK); // The color here doesn't really matter 
      graphics.fillOval(0, 0, destination.getWidth(), destination.getHeight()); 

      if (source != null) { 
       graphics.setComposite(AlphaComposite.SrcIn); // Only paint inside the oval from now on 
       graphics.drawImage(source, 0, 0, null); 
      } 
     } 
     finally { 
      graphics.dispose(); 
     } 

     return destination; 
    } 

    public static void main(String[] args) throws IOException { 
     final BufferedImage original = ImageIO.read(new File("lena.png")); 
     final BufferedImage template = compose(null, original.getWidth(), original.getHeight()); 
     final BufferedImage composed = compose(original, original.getWidth(), original.getHeight()); 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

       JPanel panel = new JPanel(new BorderLayout(10, 10)); 
       panel.add(new JLabel("+", new ImageIcon(template), SwingConstants.LEFT), BorderLayout.WEST); 
       panel.add(new JLabel("=", new ImageIcon(original), SwingConstants.LEFT), BorderLayout.CENTER); 
       panel.add(new JLabel(new ImageIcon(composed)), BorderLayout.EAST); 

       frame.add(new JScrollPane(panel)); 

       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

더 많은 정보와 예 예 the Compositing tutorial를 참조하십시오.