1

我正在尝试编写一个程序,它将图像读入 BufferedImage,在 JFrame 上绘制它,在其中绘制圆圈,然后将其写入文件。

以下代码将完成所有这些,除了保存文件的内容。保存的图像仅包含未触及的 BufferedImage。No Circles ;) 我已经尝试通过更改和添加一些代码来解决这个问题,但这并没有太大帮助。

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) 被调用两次。在最小化的情况下,它将再次被调用两次。

4

3 回答 3

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内容可以自行绘制(显然您想知道更多信息,例如width& height

这意味着它在哪里绘制并不重要。

另一件事是您可能想向渲染器提供有关如何paintable绘制的提示(例如首选大小)

只是一个想法

于 2012-08-15T10:28:30.270 回答
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 方法,因为那里不需要它。

于 2012-08-15T09:17:56.023 回答
0

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

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

无效富(缓冲图像){

    g = bufferedImage.getGraphis();
    g.drawSomething();
}
public void paint(Graphics g) {
    g.drawImage(bufferedImage);
}
于 2012-08-15T12:12:02.443 回答