2011-08-12 4 views
3

사용자가 레이어에 이미지를로드 할 수있는 응용 프로그램을 개발 중입니다. 그것을JPanel을 이미지로 저장

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.MouseWheelListener; 
import java.awt.event.MouseWheelEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

public class PaintDemo extends JPanel { 
    /** 
    * field explanation 
    */ 
    private Point startPoint = new Point(); 

    private Point endPoint = new Point(); 

    private Graphics2D g2; 

    private int minX; 

    private int minY; 

    private int maxX; 

    private int maxY; 

    private int height; 

    private int width; 


    /** 
    * Create the panel. 
    */ 

    public PaintDemo(boolean isDoubleBuffer) { 

     addMouseWheelListener(new MouseWheelListener() { 
      public void mouseWheelMoved(MouseWheelEvent e) { 
      } 
     }); 
     this.setDoubleBuffered(isDoubleBuffer); 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       endPoint = e.getPoint(); 
       Graphics g = PaintDemo.this.getGraphics(); 
       paintComponent(g); 
       minX = minX < endPoint.x ? minX : endPoint.x; 
       minY = minY < endPoint.y ? minY : endPoint.y; 
       maxX = maxX > endPoint.x ? maxX : endPoint.x; 
       maxY = maxY > endPoint.y ? maxY : endPoint.y; 
       startPoint = endPoint; 
      } 
     }); 
     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       startPoint = e.getPoint(); 
       minX = startPoint.x; 
       minY = startPoint.y; 
       maxX = startPoint.x; 
       maxY = startPoint.y; 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       endPoint = e.getPoint(); 
       Graphics g = PaintDemo.this.getGraphics(); 
       paintComponent(g); 
       minX = minX < endPoint.x ? minX : endPoint.x; 
       minY = minY < endPoint.y ? minY : endPoint.y; 
       maxX = maxX > endPoint.x ? maxX : endPoint.x; 
       maxY = maxY > endPoint.y ? maxY : endPoint.y; 
       minX = minX > 0 ? minX : 0; 
       minY = minY > 0 ? minY : 0; 
       maxX = maxX < 1024 ? maxX : 1024; 
       maxY = maxY < 768 ? maxY : 768; 
       width = maxX - minX; 
       height = maxY - minY; 
       saveImage();  
       startPoint = new Point(); 
       endPoint = new Point(); 

      } 
     }); 
    } 

    /** 
    * Paint method 
    * 
    * {@inheritDoc} 
    */ 
    @Override 
    public void paintComponent(Graphics g) { 
     g2 = (Graphics2D)g; 
     g2.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 
     g2.setFont(new Font("Serif", Font.BOLD, 18)); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(Color.red); 
     g2.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y); 
    } 

    public void saveImage() { 
     BufferedImage bi = new BufferedImage(PaintDemo.this.getWidth(), PaintDemo.this.getHeight(), BufferedImage.TYPE_INT_RGB); 
     Graphics2D g2 = bi.createGraphics(); 
     paintComponent(g2); 
     g2.dispose(); 
     try 
     { 
      ImageIO.write(bi, "jpg", new File("clip.jpg")); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println("Clip write help: " + ioe.getMessage()); 
     } 
    } 
} 

이미지 저장 : 사용자는 다른 레이어에 대한 몇 가지 그림을 그려 사용자 drawn.Here 내 코드 만 이미지를 저장할 수 있습니다

import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.ImageIcon; 
import javax.swing.JApplet; 
import javax.swing.JLabel; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class LayerDemo extends JApplet { 

    private JLayeredPane mainLayer; 

    private JPanel layer1; 

    private JPanel layer2; 

    private JLabel label; 

    private ImageIcon imgIcon; 


    /** 
    * Create the applet. 
    */ 
    public LayerDemo() {  
    } 

    public void init() { 
     Dimension mainDemension = new Dimension(1024,768); 
     setSize(mainDemension); 

     mainLayer = new JLayeredPane(); 
     layer1 = new JPanel(); 
     layer1.setOpaque(false); 
     layer1.setBounds(0, 0, this.getWidth(), this.getHeight()); 
     imgIcon = new ImageIcon("bear.jpg"); 
     label = new JLabel(imgIcon); 
     label.setBounds(0, 0, imgIcon.getIconWidth(), imgIcon.getIconHeight()); 
     layer1.add(label); 

     layer2 = new PaintDemo(true); 
     layer2.setOpaque(false); 
     layer2.setBounds(0, 0, this.getWidth(), this.getHeight()); 

     mainLayer.add(layer1, 1); 
     mainLayer.add(layer2, 2); 
     this.setContentPane(mainLayer); 
    } 

    public void paint(Graphics g) {  
    } 

} 

이 사용자 무승부의 클래스입니다 그냥 비어있는 이미지 야. 제발 도와주세요. 정말 고맙습니다. P/S : 아이디어를 편집했지만 작동하지 않습니다. 그 결과 이미지 배경이 없으며 여전히 빈 이미지를 저장합니다. :(

답변

5

사용자 정의 그림이 패널의 paintComponent() 메소드를 오버라이드하여 수행됩니다. 그런 다음 그래픽은 당신이 그림을 수행하는 객체를 사용합니다.

당신은 빈 페인트() 메소드가 없어야합니다.

drawline() 메서드는 getGraphics() 메서드를 사용하지 않고 해당 코드를 paintComponent() 메서드로 이동 한 다음 메서드에 전달 된 Graphics 개체를 사용해야합니다.

또한이 메서드를 재정의하지 말아야합니다. 애플릿의 paint() 메소드. 코드가 실제 크기로 그림을 그리기 때문에 JLab을 사용하면된다. el을 사용하여 ImageIcon을 만들어 이미지를 표시합니다. 그런 다음 레이블을 계층화 된 분할 창에 추가하여 배경 이미지로 사용합니다.

편집 :

왜 여전히 paint() 메소드가 비어 있습니까? 그것을 없애고 paint() 메소드를 오버라이드 할 필요가 없다. 나는이 코드를 실행하면 애플릿 내가 코드의 일부를 테스트 할 수 있도록 파일에 쓸 수 없습니다 때문에

나는 보안 예외를 얻을. 그러나 관심이있는 경우에는 Screen Image을 사용하여 구성 요소의 이미지를 만듭니다.

그러나 주된 문제는 페인팅 코드가 잘못되었다는 것입니다. 네, 그려진 선을 볼 수는 있지만 영구적이지는 않습니다. 영구적 인 paintinting을 원할 때 컴포넌트의 getGraphics() 메소드를 사용하지 마십시오. 몇 줄을 그린 다음 applete를 최소화 한 다음 애플릿을 복원하면 무슨 뜻인지 알 수 있습니다.

이에 대한 해결책은 BufferedImage의에 드로잉을하는 것입니다. Custom Painting ApproachesDrawOnImage 예를 참조하십시오.

+0

위의 편집 코드를 참조하십시오. –

+0

@juytu, 편집 참조. – camickr

+0

정말 고마워요. :) –

관련 문제