2011-08-12 104 views
3

私は、ユーザーがレイヤー内に画像を読み込めるようにアプリケーションを開発しています。ユーザーは別の層の上にいくつかの絵を描くと、ユーザーdrawn.Hereが私のコードであることだけで画像を保存することができます:画像としてJPanelを保存する

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

} 

これは、ユーザーのドローのためのクラスです:

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

画像を保存し、それをただ空白の画像です。助けてください。ありがとう。 P/S:あなたのアイデアとしてコードを編集しましたが、それは機能しません。その結果、画像の背景はなく、まだ空の画像は保存されません。 :(

答えて

5

カスタムペイントは、パネルのpaintComponent()メソッドをオーバーライドすることで行われます。そして、あなたはグラフィックがあなたの絵を行うためにオブジェクトを使用しています。

あなたは空のpaint()メソッドを持つべきではありません。

drawline()メソッドはgetGraphics()メソッドを使用せず、そのコードをpaintComponent()メソッドに移動し、メソッドに渡されたGraphicsオブジェクトを使用する必要があります。

また、アプレットのpaint()メソッド。あなたのコードは画像を実際のサイズでペイントしているので、JLab imageIconを作成して画像を表示する。次に、レイヤーペインにラベルを追加して、背景イメージとして使用します。

編集:

あなたはまだ空のpaint()メソッドを持っていないのはなぜ?それを取り除き、paint()メソッドをオーバーライドする必要はありません。

コードを実行すると、コードの一部をテストできないため、アプレットがファイルに書き込むことができないため、セキュリティ例外が発生します。しかし興味がある場合は、Screen Imageを使ってコンポーネントのイメージを作成します。

ただし、主な問題は、ペイントコードが間違っていることです。はい、線が引かれて見えますが、永久的ではありません。恒久的なpaintintingを行う場合は、コンポーネントのgetGraphics()メソッドを使用しないでください。いくつかの線を描いてみて、リンゴを最小にしてからアプレットを元に戻すと、私の意図がわかります。

この解決方法は、BufferedImageで図面を作成することです。 Custom Painting ApproachesDrawOnImageの例を参照してください。

+0

上記の編集コードをご覧ください。 –

+0

@juytu、編集を参照してください。 – camickr

+0

ありがとうございました。 :) –

3

ヒントはComponentImageCapture.javaを参照してください。

+0

ありがとうございました。私はそれを修正しました。 –

関連する問題