gpt4 book ai didi

java - 在缓冲图像上绘图

转载 作者:行者123 更新时间:2023-12-01 07:49:47 24 4
gpt4 key购买 nike

我正在尝试在缓冲图像上绘图。我可以在框架上获取图片,但它似乎没有在图像上绘制。如果我使用

BufferedImage bufferedImage = new BufferedImage(1280, 800,BufferedImage.TYPE_INT_RGB);

然后它似乎绘制了字符串,但我希望理想地在图像上绘制,因为我需要在项目的图像上绘制一些坐标。任何指导将不胜感激。请原谅不好的缩进

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class drawTest extends JPanel {

public void paint(Graphics g) {
Image img = createImageWithText();
g.drawImage(img, 20,20,this);
}

private Image createImageWithText(){
BufferedImage bufferedImage = new BufferedImage(1280, 800,BufferedImage.TYPE_INT_RGB);
// BufferedImage bufferedImage = new BufferedImage()
Graphics g = bufferedImage.getGraphics();

try {
bufferedImage = ImageIO.read(getClass().getResource("Unknown.jpg"));

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g.drawString("Point is here", 20,20);


return bufferedImage;
}

public static void main(String[] args) {
JFrame frame = new JFrame();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
frame.getContentPane().add(new drawTest());

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// frame.setSize(200, 200);

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
System.out.println(height + " " + width);
frame.setVisible(true);
}
}

最佳答案

您正在创建两个 BufferedImage 对象 - 一个用于获取 Graphics 上下文并在其上绘制文本,另一个用于保存通过 ImageIO 获取的图片,但您不这样做t 绘制文本。您返回后者,因此该图片不包含新文本是有道理的。

    // BufferedImage Object ONE
BufferedImage bufferedImage = new BufferedImage(1280, 800, BufferedImage.TYPE_INT_RGB);
Graphics g = bufferedImage.getGraphics(); // Graphics for the first object only

try {
// BufferedImage object TWO
bufferedImage = ImageIO.read(getClass().getResource("Unknown.jpg"));

} catch (IOException e) {
e.printStackTrace();
}

// draw with the graphics context for the first object
g.drawString("Point is here", 20, 20);

return bufferedImage; // but return the second

解决方案:不要这样做,仅创建一个 BufferedImage,例如通过ImageIO,获取其图形上下文,用它进行绘制,完成后处置图形,以及返回它。

例如,

// have method accept the image path and 
// have it throw an exception if the path is bad
private Image createImageWithText2(String resourcePath) throws IOException {

// create one and only one BufferedImage object.
// If this fails, the exception will bubble up the call chain
BufferedImage bufferedImage = ImageIO.read(getClass().getResource(resourcePath));

// get the Graphics context for this single BufferedImage object
Graphics g = bufferedImage.getGraphics();

g.drawString("Point is here", 20, 20);

g.dispose(); // get rid of the Graphics context to save resources

return bufferedImage;
}

您的代码的其他问题如下:

public void paint(Graphics g) {
Image img = createImageWithText();
g.drawImage(img, 20,20,this);
}

问题包括:

  • 您覆盖了错误的绘画方法。您应该重写paintComponent,而不是paint,事实上您的问题提到了paintComponent,所以我不确定您为什么要这样做。
  • 您正在重写绘画方法,但没有调用 super 方法,从而破坏了绘画链。
  • 您在绘画方法中不必要地重复执行文件 I/O,该方法对 GUI 的感知响应能力影响最大,因此您不想做一些事情。读取图像一次,将其存储到变量中,在paintComponent中使用该变量,并且切勿在绘画方法中执行文件I/O。
  • 您将想要学习和使用 Java naming conventions 。变量名应全部以小写字母开头,而类名应以大写字母开头。学习并遵循这一点将使我们能够更好地理解您的代码,并且将使您更好地理解其他人的代码。

关于java - 在缓冲图像上绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439572/

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