4

ユーザーがキャンバスコントロールに描画できるようにする簡単なアプリケーションがあります。

さて、私が欲しいのはそのキャンバスを画像に変換することです。これが私のコードです。

public void paint(Graphics g)
{
    //super.paint(g);
    Graphics2D draw = (Graphics2D) g;
    if(this.is_beginning || this.to_save)
    {
        draw.setColor(Color.white);
        draw.fillRect(0, 0, this.getWidth(), this.getHeight());
        this.is_beginning= false;
    }
    if(this.m_alzada)
    {
        draw.setColor(Color.red);
        draw.drawLine(uX, uY, x, y);

    }
}

そして、これは画像を保存するための私の方法です。

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    int w = canvas1.getWidth();
    int h = canvas1.getHeight();
    int type = BufferedImage.TYPE_INT_BGR;
    BufferedImage image = new BufferedImage(w,h,type);
    Graphics2D g2 = image.createGraphics(); 
    canvas1.to_save = true;
    canvas1.paint(g2);
    try {
        ImageIO.write(image, "png", new File("C:/Users/Uriel/Desktop/ejemplo.png"));
    } catch (IOException ex) {
        Logger.getLogger(main.class.getName()).log(Level.SEVERE, null, ex);
    }

}

これらすべてが空白の画像になり、ペイント方法がどのように機能するかを知っています。それが私の問題のあるところにあることに気づきます。しかし、ペイント方法でユーザーがすでに描画したものをすべて描画するにはどうすればよいですか?

悪い英語で失礼します、私はメキシコから来ました。ちなみにありがとう。

Canvas og HTML5を使用して、キャンバス内の各ピクセルのRGB情報を含むマトリックスを取得する場合のようなものを作成する方法があるかどうかを知りたいと思います。JAVAのcanvasコンポーネントでそれを行うことは可能ですか?

4

1 に答える 1

6

コンポーネントのサイズが適切であることを確認する以外に、代わりにメソッドを使用JComponent#printしてください。JComponent#printAll

これらはダブルバッファリングを無効にし、画面に印刷することを期待しているときに他のネイティブピアの問題を克服します

更新しました

サンプルアプリから...

ここに画像の説明を入力してください

このダンプを作成することができました

ここに画像の説明を入力してください

このコードを使用する

Container pane = frame.getContentPane();
BufferedImage img = new BufferedImage(pane.getWidth(), pane.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
pane.printAll(g2d);
g2d.dispose();
try {
    ImageIO.write(img, "png", new File("save.png"));
} catch (IOException ex) {
    ex.printStackTrace();
}

更新しました

私はあなたが描くことがあなたの問題の原因ではないと思います。しかし、それはできるほどきれいではありません。

そもそも、「描画」サーフェスはから拡張されてjava.awt.Canvasおり、に追加しているのでJFrame、重いコンポーネントと軽いコンポーネントを混合することは決して良い考えではありません。

public class Dibujo extends Canvas ...

あなたは次のようなものを使用する方が良いですJPanel

public class Dibujo extends JPanel ...

これは絶対にしないでください

public void paint(Graphics g) {
    //super.paint(g);

super.paintあなたは、単にコンポーネントを埋めるよりも、後ろでもっと起こっていることを呼び出さなければなりません。のようなものを使い始めたら、代わりJPanelにオーバーライドする必要があります。paintComponent

ペイントメソッドの最後の線分のみを描画します...

if (this.m_alzada) {
    draw.setColor(Color.
    draw.drawLine(uX, uY, x, y);
}

つまり、コンポーネントを保存しようとすると、最後のセグメントのみが表示されます。このpaintメソッドは、呼び出されるたびにすべての線分をペイントする必要があります。

あなたのmouseDragged方法では、あなたはこれをやっています...

this.paint(this.getGraphics());

しないでください。グラフィックを更新する責任はありません。リペイントマネージャーが責任を負います。これは基本的に、スクラッチパッドのグラフィックスコンテキストにペイントすることだけです。次の再ペイント要求が処理されるとすぐに、すべてが完全に消去されます。

基本的な概念のいくつかを理解するには、カスタムペイントの実行を一読する必要があると思います。また、Javaでペインティングがどのように機能するかを理解するために、AWTとSwingでのペインティングを読み通しました。

あなたのコードを変更した後、私はこれを得ることができました...

ここに画像の説明を入力してください

このように保存するには...

ここに画像の説明を入力してください

package prueba_uno_graphics;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.*;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;

/**
 *
 * @author Uriel
 */
// Don't mix heavy and light weight components
public class Dibujo extends JPanel implements ActionListener, MouseListener, MouseMotionListener {

//    ArrayList lineas = new ArrayList();
//    boolean m_alzada = true, is_beginning = true, to_save = false;
//    int uX, uY, x, y;

    private Path2D shape;

    Dibujo() {
        setBackground(Color.WHITE);
        shape = new Path2D.Float();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D draw = (Graphics2D) g;
//        if (this.is_beginning || this.to_save) {
//            draw.setColor(Color.white);
//            draw.fillRect(0, 0, this.getWidth(), this.getHeight());
//            this.is_beginning = false;
//        }
//        if (this.m_alzada) {
//            draw.setColor(Color.red);
//            draw.drawLine(uX, uY, x, y);
//
//        }

        draw.setColor(Color.RED);
        draw.draw(shape);

    }

//    @Override
//    public void paint(Graphics g) {
//        // ALWAYS call super.paint
//        super.paint(g);
//        Graphics2D draw = (Graphics2D) g;
//        if (this.is_beginning || this.to_save) {
//            draw.setColor(Color.white);
//            draw.fillRect(0, 0, this.getWidth(), this.getHeight());
//            this.is_beginning = false;
//        }
//        if (this.m_alzada) {
//            draw.setColor(Color.red);
//            draw.drawLine(uX, uY, x, y);
//
//        }
//    }

    @Override
    public void actionPerformed(ActionEvent e) {
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        //        this.uX = e.getX();
        //        this.uY = e.getY();
        Point point = e.getPoint();
        shape.moveTo(point.x, point.y);

    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        //        this.x = e.getX();
        //        this.y = e.getY();
        // Don't do this!
        //        this.paint(this.getGraphics());
        //        ArrayList ayuda = new ArrayList();
        //        ayuda.add(uX);
        //        ayuda.add(uY);
        //        ayuda.add(x);
        //        ayuda.add(y);
        //        this.lineas.add(ayuda);
        //        uX = x;
        //        uY = y;
        Point point = e.getPoint();
        shape.lineTo(point.x, point.y);
        repaint();

    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }

}
于 2012-10-20T01:00:06.357 に答える