Невозможно преобразовать текущие данные canvasа в изображение в java

У меня есть простое приложение, которое позволяет пользователю рисовать элемент управления canvasом.

Теперь я хочу преобразовать этот canvas в изображение. Итак, вот мой код.

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 каждого пикселя в canvasе. Можно ли сделать это с помощью компонента canvasа в JAVA?

Помимо того, что компонент правильно JComponent#printAll вместо этого используйте 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 происходит super.paint заполнение компонента. Как только вы начнете использовать что-то вроде JPanel , вместо этого вы захотите переопределить paintComponent .

Вы только рисуете последний сегмент линии в своем методе рисования …

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

Это означает, что при попытке сохранить компонент вы увидите только последний сегмент. Метод paint должен рисовать ВСЕ участки линий каждый раз, когда он вызывается.

В вашем методе mouseDragged вы делаете это …

 this.paint(this.getGraphics()); 

DO NOT. Вы не отвечаете за обновление графики, это менеджер перерисовки. Все, что это делает, в основном заключается в том, чтобы рисовать на графический контекст с нуля, как только будет обработан следующий запрос на перерисовку, все будет очищено.

Я думаю, вам нужно прочитать « Выполнение пользовательской живописи», чтобы понять некоторые основные понятия. Я также прочитал бы « Живопись» в AWT и Swing, чтобы понять, как живопись работает на Java.

После изменения кода я смог получить это …

введите описание изображения здесь

Чтобы сохранить это …

введите описание изображения здесь

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