我正在尝试编写一个程序,将Image读入BufferedImage,在JFrame上绘制它,在其中绘制圆圈,然后将其写入文件。
除了保存文件的内容之外,以下代码将执行所有操作。保存的图像仅包含未触及的BufferedImage。没有圈子;)我已经通过更改和添加一些代码来解决这个问题,但它没有太多帮助。
public class PaintImage extends Component {
BufferedImage img;
private int pngWidth, pngHeight;
public int getPngWidth() {
return pngWidth;
}
public int getPngHeight() {
return pngHeight;
}
public void paint(Graphics g) {
super.paint(g);
//g = img.createGraphics();
g.drawImage(img, 0, 0, 809, 1080, null);
g.drawOval(33, 33, 444, 444);
}
public PaintImage() {
try {
img = ImageIO.read(new File("C:\\karte_vorlage.png"));
pngWidth = img.getWidth();
pngHeight = img.getHeight();
} catch (IOException e) {
}
}
public void writeImage () {
try {
img.getGraphics();
ImageIO.write(img, "png", new File("C:\\save.png"));
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
取消注释g = img.createGraphics();导致图像中断。
请帮帮我。谢谢大家。
编辑: 1.方法paint(Graphics g)被调用两次。如果最小化,将再次调用两次。
答案 0 :(得分:2)
您可以直接将组件直接绘制到BufferedImage
BufferedImage tempImage = new BufferedImage(imagePane.getWidth(), imagePane.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g = tempImage.createGraphics();
imagePane.printAll(g);
ImageIO.write(tempImage, "png", new File("C:\\save.png"));
你可能想玩宽度和宽度。高度,以更好地满足您的要求,但
<强>已更新强>
继续考虑这个问题。
另一个想法是创建某种“绘制管理器”或“可绘制”界面,给定Graphics
内容可以自己绘制(显然你想知道更多信息,如{{ 1}}&amp; width
)
这意味着绘画的位置无关紧要。
另一件事是你可能希望向渲染器提供有关如何绘制height
(如首选大小)的提示
只是一个想法
答案 1 :(得分:0)
以另一种方法将圆圈绘制到图像中。您可以随时调用此其他方法。然后在paint方法中,您只需将图像绘制到组件中,而不是其他任何内容。
public void paint(Graphics g) {
super.paint(g);
g.drawImage(img, 0, 0, 809, 1080, null);
}
public void drawCircle() {
Graphics g = img.getGraphics();
g.drawOval(33, 33, 444, 444);
}
你也可以删除img.getGraphics();来自writeImage方法,因为它不需要。
答案 2 :(得分:0)
你应该改变你的设计。试试这个:
void foo(bufferedImage){
g = bufferedImage.getGraphis();
g.drawSomething();
}
public void paint(Graphics g) {
g.drawImage(bufferedImage);
}