gpt4 book ai didi

Java 将 2D 图形作为参数传递

转载 作者:行者123 更新时间:2023-12-01 16:53:44 25 4
gpt4 key购买 nike

我有一个功能,可以绘制图像,然后立即保存它,但问题是它似乎绘制了两次,一次用于屏幕上的 View ,然后一次将其保存到磁盘

public class myFrame {

public static void main(String[] args) {

JFrame lv_frame = new JFrame();
// setup jframe here

lv_frame.add(new image());

lv_frame.setVisible(true);

}

}

class image extends JPanel {

public void paintComponent(Graphics graphic) {

super.paintComponent(graphic);
draw(graphic);
save();

}

public void draw(Graphics graphic) {

Graphics2D graphic2D = (Graphics2D) graphic;
graphic2D.fillArc(0, 0, 250, 250, 0, 90);

}

public void save() {

BufferedImage image = new BufferedImage(250, 250, BufferedImage.TYPE_4BYTE_ABGR_PRE);
Graphics2D graphic2D = image.createGraphics();

try {
File output = new File("file.png");

// is it possible to use the graphic I've already
// drawn here instead of re-drawing?
draw(graphic2D);

ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}

}

}

我有一个函数draw,它在gui屏幕上创建图像,另一个函数save,它将图像保存到磁盘,但save函数也调用draw。

是否可以保存已绘制的图像,而无需像我的代码中那样重新调用绘制函数?

最佳答案

我正在 Display to GUI and Save to Disk with a Single Object/Variable 上回答您的问题,但是可能由于您的问题的相似性质而被关闭。我认为您似乎对几个问题感到困惑,我想在这里写下我的解决方案,该解决方案也解决了您重复帖子中的问题。

<小时/>

Is it possible to save the image that has already been drawn without re-calling the draw function as it is being done in my code?

不要混淆在面板上绘制图像和保存图像。下面显示了保存绘制图像的工作示例。

class DrawingSpace extends JPanel
{
private BufferedImage buf;

public DrawingSpace(){
setPreferredSize(new Dimension(200, 200));
buf = new BufferedImage(200, 200, BufferedImage.TYPE_INT_ARGB);
drawOnBuffer();
}

public void drawOnBuffer(){
Graphics g = buf.createGraphics();
g.setColor(Color.BLUE);
g.fillOval(0,0,200,200);
g.setColor(Color.RED);
g.fillOval(50,50,100,100);
g.dispose();
}

public void saveBufferAsImage(String pathname){
String fmt = "";
if(!(pathname == null || pathname.equals(""))){
fmt = pathname.substring(pathname.lastIndexOf(".")+1);
File outputfile = new File(pathname);
try{
ImageIO.write(buf, fmt, outputfile);
}catch(IOException ioe){System.out.println("Unable to save file");}
}
}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(buf, 0, 0, 200, 200, null); //Only for user to see
}
}

要保存图像,您不一定必须首先在 JPanel 中绘制并显示它。请注意,我创建了一个名为 bufBufferedImage,并且在 buf 上绘图。一旦我绘制到 BufferedImage 上,我就可以简单地将该图像保存为文件(我不必先将其绘制到面板上)。

请注意,我执行了以下操作:

    @Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(buf, 0, 0, 200, 200, null); //Only for user to see
}

g.drawImage(buf, 0, 0, 200, 200, null) 会将 buf 上的任何内容绘制到 JPanel 上。它可以被删除,并且保存仍然有效。当我在面板上绘制它时,只是让用户看到绘制的结果。

测试程序:

class SaveImageRunner{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
JFrame frame = new JFrame("Saving a buffered image");
DrawingSpace ds = new DrawingSpace();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(ds);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
ds.saveBufferAsImage("BlueCircle.png");
}
});
}
}

保存的图像:

enter image description here

<小时/>

绘图的一些提示:

  • paintComponent(Graphics) 只包含绘图代码,不包含其他内容。不要实现将图像保存到此处文件的代码。

  • 尽量不要在paintComponent(Graphics)中创建新的BufferedImage。如果没有,每次重绘时都会创建 BufferedImage 的新实例。

关于Java 将 2D 图形作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696758/

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