java 如何用BufferedImage画出图像

2025-01-07 23:38:05
推荐回答(4个)
回答1:

  1. drawimage都是对Image对象处理,和组件的绘制一点关系也没;

  2. 把newImage的图再画到image里面去;

  3. 实例代码如下:

    public class Tank extends JFrame {
    private Image img = null;
    boolean fi = false;
    BufferedImage bi;

    public Tank() {
     this.addKeyListener(new KeyMonitor());
     this.setBounds(300, 300, 300, 300);
     this.setVisible(true);
     
     this.setDefaultCloseOperation(Tank.EXIT_ON_CLOSE);

    }

    class KeyMonitor extends KeyAdapter {
     @Override
     public void keyPressed(KeyEvent e) {
      switch (e.getKeyCode()) {
     
      case 37: {
       
       img = getToolkit().createImage("res/TankPic/pre.GIF");
       
       fi = true;
       System.out.println(img);
       repaint();
       break;
      }
      }
     
     }
    }

    public void paint(Graphics g) {
     super.paint(g);
     
     bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
     bi.getGraphics();
     if (fi) {
      g = img.getGraphics();
      g.drawImage(bi, 50, 50, 40, 40, this);
     }
    }

    public static void main(String[] args) {
     new Tank();
    }
    }

回答2:

我不明白在界面组件这个层次上讨论双缓存是什么样一个概念?说不定swing在绘制的时候本身已经双帧缓存了
另外呢,你要把图像画到内存中,那就是Image对象啊,这个对象不就是在内存中的吗,你要缓存多个图像,那就是用多个Image对象啊。

我不知道BufferedImage相对于Image的其他实现来说有什么区别,如果你一定要BufferedImage的话你也可以用已有的Image创建一个新的BufferedImage对象,这都是没问题的,但是当你要画在界面上的时候,你必须使用界面组件给你的paint的参数的那个Graphics对象绘制
=============================================================
这个问题和BufferedImage没有关系,其实是你多次一举了。。。
img = getToolkit().createImage("res/TankPic/pre.GIF");已经有了Image对象,不需要再创建BufferedImage的对象bi
在paint方法中也是,paint方法已经给了你Graphics 对象,这个参数g是和组件本身相关的,你用他绘制就会绘制在界面上,你用img.getGraphics()得到的Graphics对象是和img对象相关的,用这个对象绘制只会绘制在img图片本身上

另外,把图像会在一个JPanel上吧,在把那个JPanel显示在JFrame上

回答3:

zy974400763说的像真的一样。。。
连paint的参数g都没用到,你能画到JFrame上?你所有的drawimage都是对Image对象处理,和组件的绘制一点关系也没。。

简单的说,你做的就是新建一幅图,我称为newImage吧,把原来的图,我称为image,先画进去,然后再把newImage的图再画到image里面去。对于int a来说,你做的就是这样:
int b = a;
a = b;
这样做的不是缓存,而是缓冲。缓存是指存着以后要用的东西提高效率,缓冲则是指在某个地方停一停,做一些冗余的事情,是一种降低速度的行为。

回答4:

修改paint方法如下:
public void paint(Graphics g) {
super.paint(g);

bi = new BufferedImage(getSize().width, getSize().height, BufferedImage.TYPE_INT_ARGB);
Graphics bg = bi.getGraphics(); //在这里获得了bi的Graphics的引用
bg.drawImage(要显示的图片,.....);//调用bg的drawImage方法。
if (fi) {

g = img.getGraphics();
g.drawImage(bi, 50, 50, 40, 40, this);
}

}
以上要改的就是我加注释的那两句。具体的思路就是当我们要在哪里绘图时,就先获得该对象的Graphics对象的引用,然后调用drawImage的方法。对于BuffereImage对象也是一样的。先在BuffereImage对象中绘图,然后将BuffereImage对象绘制到Frame中。这样就实现了双缓冲了。