Java Graphics2D 绘图到 BufferedImage
Java Graphics2D Drawing into BufferedImage
我正忙于摆弄 Java 的 Graphics2D 和绘图,虽然它可以工作,但我不确定如何从该图形创建 BufferedImage,我似乎需要这样做才能保存它在某个地方。
我有一些非常基础的东西,因为我想了解它是如何工作的
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class myFrame {
public static void main(String[] args) {
JFrame lv_frame = new JFrame();
lv_frame.setTitle("Drawing");
lv_frame.setSize(300, 300);
lv_frame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
lv_frame.add(new drawingPanel(5, 5));
lv_frame.setVisible(true);
}
}
class drawingPanel extends JPanel {
public drawingPanel(int x, int y) {
}
public void draw(Graphics graphic) {
Graphics2D graphic2D = (Graphics2D) graphic;
graphic2D.fillArc(0, 0, 50, 50, 0, 45);
graphic2D.fillArc(0, 0, 50, 50, 135, 45);
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
try {
graphic2D = image.createGraphics();
File output = new File("output.png");
ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}
}
public void paintComponent(Graphics graphic) {
super.paintComponent(graphic);
draw(graphic);
}
}
这工作正常,除了我得到一个空白的 png 作为我的 output.png 我不确定为什么虽然我很确定我的代码是非常错误的
工作版本
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class myFrame {
public static void main(String[] args) {
JFrame lv_frame = new JFrame();
lv_frame.setTitle("Drawing");
lv_frame.setSize(300, 300);
lv_frame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
lv_frame.add(new drawingPanel());
lv_frame.setVisible(true);
}
}
class drawingPanel extends JPanel {
public void paintComponent(Graphics graphic) {
super.paintComponent(graphic);
draw(graphic);
saveImage();
}
public void draw(Graphics graphic) {
Graphics2D graphic2D = (Graphics2D) graphic;
Color color = Color.decode("#DDDDDD");
graphic2D.setPaint(color);
graphic2D.fillArc(0, 0, 50, 50, 0, 45);
graphic2D.fillArc(0, 0, 50, 50, 135, 45);
}
public void saveImage() {
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
Graphics2D graphic2D = image.createGraphics();
try {
File output = new File("output.png");
draw(graphic2D);
ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}
}
}
您正在用从 image.createGraphics()
获得的对象覆盖 Graphics2D
对象,该对象在您刚刚创建时是空白的。
将 draw
方法简化为:
public void draw(Graphics graphic) {
Graphics2D graphic2D = (Graphics2D) graphic;
graphic2D.fillArc(0, 0, 50, 50, 0, 45);
graphic2D.fillArc(0, 0, 50, 50, 135, 45);
}
然后从另一个方法调用它,在您实际的 Image
的 Graphics2D
上执行绘画:
public void saveAsImage(){
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
try {
Graphics2D graphic = image.createGraphics();
File output = new File("output.png");
draw(graphic); // actual drawing on your image
ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}
}
我正忙于摆弄 Java 的 Graphics2D 和绘图,虽然它可以工作,但我不确定如何从该图形创建 BufferedImage,我似乎需要这样做才能保存它在某个地方。
我有一些非常基础的东西,因为我想了解它是如何工作的
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class myFrame {
public static void main(String[] args) {
JFrame lv_frame = new JFrame();
lv_frame.setTitle("Drawing");
lv_frame.setSize(300, 300);
lv_frame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
lv_frame.add(new drawingPanel(5, 5));
lv_frame.setVisible(true);
}
}
class drawingPanel extends JPanel {
public drawingPanel(int x, int y) {
}
public void draw(Graphics graphic) {
Graphics2D graphic2D = (Graphics2D) graphic;
graphic2D.fillArc(0, 0, 50, 50, 0, 45);
graphic2D.fillArc(0, 0, 50, 50, 135, 45);
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
try {
graphic2D = image.createGraphics();
File output = new File("output.png");
ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}
}
public void paintComponent(Graphics graphic) {
super.paintComponent(graphic);
draw(graphic);
}
}
这工作正常,除了我得到一个空白的 png 作为我的 output.png 我不确定为什么虽然我很确定我的代码是非常错误的
工作版本
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class myFrame {
public static void main(String[] args) {
JFrame lv_frame = new JFrame();
lv_frame.setTitle("Drawing");
lv_frame.setSize(300, 300);
lv_frame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
lv_frame.add(new drawingPanel());
lv_frame.setVisible(true);
}
}
class drawingPanel extends JPanel {
public void paintComponent(Graphics graphic) {
super.paintComponent(graphic);
draw(graphic);
saveImage();
}
public void draw(Graphics graphic) {
Graphics2D graphic2D = (Graphics2D) graphic;
Color color = Color.decode("#DDDDDD");
graphic2D.setPaint(color);
graphic2D.fillArc(0, 0, 50, 50, 0, 45);
graphic2D.fillArc(0, 0, 50, 50, 135, 45);
}
public void saveImage() {
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
Graphics2D graphic2D = image.createGraphics();
try {
File output = new File("output.png");
draw(graphic2D);
ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}
}
}
您正在用从 image.createGraphics()
获得的对象覆盖 Graphics2D
对象,该对象在您刚刚创建时是空白的。
将 draw
方法简化为:
public void draw(Graphics graphic) {
Graphics2D graphic2D = (Graphics2D) graphic;
graphic2D.fillArc(0, 0, 50, 50, 0, 45);
graphic2D.fillArc(0, 0, 50, 50, 135, 45);
}
然后从另一个方法调用它,在您实际的 Image
的 Graphics2D
上执行绘画:
public void saveAsImage(){
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
try {
Graphics2D graphic = image.createGraphics();
File output = new File("output.png");
draw(graphic); // actual drawing on your image
ImageIO.write(image, "png", output);
} catch(IOException log) {
System.out.println(log);
}
}