6

私はjaveの初心者です。最初のプロジェクトは描画で、JPanelから画像を保存します。描画は完了しましたが、JPanelで描画した後は保存できません:(、描画後の画像、何も含まれていません:(ここに私のコード:

package image;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class paint extends JFrame{
private Point points[] = new Point[10000];
private Point pointends[] = new Point[10000];
private int pointCount = 0;
private JButton save_btn;
public paint()
{
    panel paint2 = new panel();
    add(paint2,BorderLayout.CENTER);
}
private class panel extends JPanel
{   
    private paint my_paint;
    public panel()
    {   
        setBackground(Color.WHITE);
        save_btn = new JButton();
        save_btn.setText("123");
        this.add(save_btn);
        ButtonHandler handler1 = new ButtonHandler();
        save_btn.addActionListener(handler1);
        MouseHandler handler = new MouseHandler();
        this.addMouseMotionListener(handler);

        this.addMouseListener(handler);
    }
    private class ButtonHandler implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            savefile();
        }

    }
    @Override
    protected void paintComponent(Graphics g) 
    {
        // TODO Auto-generated method stub
        super.paintComponent(g);
        for(int i = 0;i <pointCount;i++)
        {   
            g.setColor(Color.RED);
            g.drawLine(points[i].x, points[i].y, pointends[i].x, pointends[i].y);
        }           
    }



private class MouseHandler extends MouseAdapter
{  
    @Override
    public void mouseDragged(MouseEvent e) 
    {
        // TODO Auto-generated method stub
            pointends[ pointCount-1] = e.getPoint();
            repaint();


    }
    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        super.mousePressed(e);
        if(pointCount < points.length)
        {
            points[ pointCount ] = e.getPoint();
            pointends[ pointCount ] = e.getPoint();
            pointCount++; 
            repaint();
        }
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        super.mouseReleased(e);
        /*pointends[pointCount]=e.getPoint();
        repaint();
        pointCount++;
    */
    }

    }

}
public void savefile()
{
    BufferedImage image2 = new BufferedImage(panel.WIDTH, panel.HEIGHT,     BufferedImage.TYPE_INT_RGB);
    JFileChooser jFile = new JFileChooser();
    jFile.showSaveDialog(null);
    Path pth = jFile.getSelectedFile().toPath();
    JOptionPane.showMessageDialog(null, pth.toString());
    Graphics2D graphics2D = image2.createGraphics();
    try {
        ImageIO.write(image2, "", new File(pth.toString()));
    } catch (IOException ox) {
        // TODO: handle exception
        ox.printStackTrace();

}
}
}
4

4 に答える 4

14

絵画を保存する BufferedImage を作成します。ペイントするときは、BufferedImage にペイントします。

JPanelでペイントを表示する必要がある場合は、JPanelでBufferedImageを描画します。

このようにして、ペイントをファイルにロード/保存できます。

このようなもの:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Paint extends JPanel{
    private BufferedImage paintImage = new BufferedImage(500, 400, BufferedImage.TYPE_3BYTE_BGR);

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(paintImage, 0, 0, null);
    }

    // draw painting
    public void updatePaint(){
        Graphics g = paintImage.createGraphics();

        // draw on paintImage using Graphics

        g.dispose();
        // repaint panel with new modified paint
        repaint();
    }

    public void save() throws IOException{
        ImageIO.write(paintImage, "PNG", new File("filename.png"));
    }

    public void load() throws IOException {
        paintImage = ImageIO.read(new File("filename.png"));
        // update panel with new paint image
        repaint();
    }
}
于 2013-10-27T17:41:28.037 に答える
7
private void saveImage(){
    BufferedImage imagebuf=null;
    try {
        imagebuf = new Robot().createScreenCapture(panel.bounds());
    } catch (AWTException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }  
     Graphics2D graphics2D = imagebuf.createGraphics();
     panel.paint(graphics2D);
     try {
        ImageIO.write(imagebuf,"jpeg", new File("save1.jpeg"));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        System.out.println("error");
    }
}

スニペットコードの結果例

于 2016-08-04T03:20:47.503 に答える
6

良いアプローチがあります:

BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
component.paint(g);
 try {
        ImageIO.write(image, "png", new File(filename));
    } catch (IOException ex) {
        Logger.getLogger(CustomApp.class.getName()).log(Level.SEVERE, null, ex);
   }

それが行うすべてのこと:ARGB透明度をサポートするために、可視コンポーネントのサイズとタイプを持つ画像を作成します。次に、グラフィックを取得し、スナップショットを取得するコンポーネントに渡します。そのコンポーネントの子コンポーネントを、描画されたものを含めて描画します。

更新: component.print(Graphics g) も使用できます:

Dimension componentSize = component.getPreferredSize();
component.setSize(componentSize); // need to make sure that both sizes are equal
BufferedImage image = new BufferedImage(comonent.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
g.fillRect(0, 0, image.getWidth(), image.getHeight());
component.print(g);

ただし、この関数はコンポーネントのレンダリングされたグラフィックのみを描画し、子コンポーネントは描画しません。私はそれをテストしました。


編集:

  1. クラスpaint extends JFrameには素敵な名前を付けることができますPaintFrame extends JFrame。クラス名に関数の名前を付けてはなりません。ペイントはverbです。関数です。
  2. panel extends JPanel: なぜ最初の文字が小文字のクラス名を選択する必要があるのですか? コンポーネントに何をしているかを反映する名前を付けることができます。MyCanvas extends JPanel
  3. panelあなたの最初のステートメントの中でprivate paint my_paint;: それはここで不必要に何をしているのですか?
  4. あなたのsaveFile()関数は に属し、フレーム コンストラクターに対してローカルに (描画している) をJFrame作成しました。panel関数はどのようsaveFile()にアクセスする必要がありますか? JFrame クラス コンテキストでペイント パネルをpublicorとして宣言しますprivate
  5. getWidth()andを使用してコンポーネントのサイズを読み取る意味のある方法で書きましたが、getHeight()あなたは次のように書いています:

         BufferedImage image2 = new BufferedImage(panel.WIDTH, panel.HEIGHT, ...);
    

pngまた、画像を使用ImageIO.write(image, "png", "myFile.png")関数として保存する方法のコードを完全に記述しました。回答をよく読んでください。

次のリソースが役立つ場合があります。

  1. 塗装のメカニズムを詳しく見てみましょう。
  2. 画像の書き込みと保存
于 2013-10-27T18:55:07.170 に答える
1

Screen Imageを使用すると、任意のコンポーネントの画像を保存できます。

于 2013-10-27T17:42:56.490 に答える