gpt4 book ai didi

Java BufferedImage 从 Canvas 返回黑色图像

转载 作者:行者123 更新时间:2023-12-02 19:43:02 24 4
gpt4 key购买 nike

我一直在尝试制作一个简单的程序,它有一个类似画笔的工具,当打开它时,它创建了一个 JFrame,并在其中放置了一个 Canvas,用户可以在其中进行绘制。现在,我尝试使用退出时调用的 saveCanvas 方法保存绘图,但无论我做什么,结果都会得到黑色图像。这是我的代码:

public class Test{

JFrame f;
Canvas c;
int x=-1, y=-1;

public Test() {
f = new JFrame();
f.setSize(1200, 800);
c = new Canvas(){
@Override
public void paint(Graphics g){
super.paint(g);
}
};
f.add(c);
c.addMouseMotionListener(new MouseMotionListener(){
@Override
public void mouseMoved(MouseEvent e) {
// empty
}
@Override
public void mouseDragged(MouseEvent e){
if(x==-1){
x = e.getX();
y = e.getY();
}
c.getGraphics().fillOval(x, y, 5, 5);
x = e.getX();
y = e.getY();
}
});
f.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent evt) {
onExit();
}
public void onExit()
{
saveCanvas(c);
System.exit(0);
}
});
f.setVisible(true);
}

public static void main(String[] args) {

Test paintBrush = new Test();
}
public static void saveCanvas(Canvas canvas){

BufferedImage image=new BufferedImage(canvas.getWidth(), canvas.getHeight(),BufferedImage.TYPE_INT_ARGB);
Graphics2D g2=(Graphics2D)image.getGraphics();
boolean x = false;
while(!x){
x = g2.drawImage(image, 0, 0, null);
}
try
{
ImageIO.write(image, "png", new File("C:\\test\\canvas.png"));
}
catch (Exception e) {

}
}
}

有什么想法可能导致这种情况吗?

最佳答案

这是错误的:

            Graphics2D g2=(Graphics2D)image.getGraphics();
boolean x = false;
while(!x){
x = g2.drawImage(image, 0, 0, null);
}

您获取imageGraphics,然后将image 绘制到该Graphics 上。所以基本上,您是在自身上绘制图像

你想要的可能更像是这样:

            Graphics2D g2=(Graphics2D)image.getGraphics();
canvas.print(g2);
...

现在,请考虑以下评论:

  • 不要使用 Canvas (AWT),而是使用 JPanel(并覆盖 paintComponent)或 JLabel使用 BufferedImage(在 BufferedImageGraphics 上绘制,并在 JLabel 上调用 repaint() )( Swing )
  • 不要在任何组件上使用 getGraphics,请使用 paintComponent 方法中提供的 Graphics

我正在谈论的内容的小演示示例:

import java.awt.Desktop;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class Test {

JFrame f;
JLabel c;
BufferedImage image;
int x = -1, y = -1;

public Test() {
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
image = new BufferedImage(1200, 800, BufferedImage.TYPE_INT_ARGB);
c = new JLabel(new ImageIcon(image));

f.add(c);
c.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent e) {
// empty
}

@Override
public void mouseDragged(MouseEvent e) {
if (x == -1) {
x = e.getX();
y = e.getY();
}
image.getGraphics().fillOval(x, y, 5, 5);
c.repaint();
x = e.getX();
y = e.getY();
}
});
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent evt) {
onExit();
}

public void onExit() {
try {
File output = new File("C:\\test\\canvas.png");
if (!output.getParentFile().exists()) {
output.getParentFile().mkdirs();
}
ImageIO.write(image, "png", output);
Desktop.getDesktop().open(output);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
f.pack();
f.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {

Test paintBrush = new Test();
}
});
}

}

关于Java BufferedImage 从 Canvas 返回黑色图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16565310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com