在JFrame上绘制BufferedImage并写入File

时间:2012-08-15 08:49:42

标签: java graphics awt bufferedimage

我正在尝试编写一个程序,将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)被调用两次。如果最小化,将再次调用两次。

3 个答案:

答案 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)

你应该改变你的设计。试试这个:

  1. 读取png文件并将其保存到bufferedImage。
  2. 更改你的paint()方法(这非常重要,因为你想要 是一个带有附加元素的新图像,但您的代码意味着 首先绘制一个png,然后在UI上绘制一个椭圆)。它不会修改bufferedImage。 添加自己的事件来更改bufferedImage。例如,当您单击按钮时,运行如下方法:
  3. void foo(bufferedImage){

        g = bufferedImage.getGraphis();
        g.drawSomething();
    }
    public void paint(Graphics g) {
        g.drawImage(bufferedImage);
    }