java 如何用BufferedImage画出图像

实例代码如下: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...
java 如何用BufferedImage画出图像
zy974400763说的像真的一样。。。
连paint的参数g都没用到,你能画到JFrame上?你所有的drawimage都是对Image对象处理,和组件的绘制一点关系也没。。

简单的说,你做的就是新建一幅图,我称为newImage吧,把原来的图,我称为image,先画进去,然后再把newImage的图再画到image里面去。对于int a来说,你做的就是这样:
int b = a;
a = b;
这样做的不是缓存,而是缓冲。缓存是指存着以后要用的东西提高效率,缓冲则是指在某个地方停一停,做一些冗余的事情,是一种降低速度的行为。2010-02-26
drawimage都是对Image对象处理,和组件的绘制一点关系也没;
把newImage的图再画到image里面去;
实例代码如下:
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(); }}
2015-07-11
我不明白在界面组件这个层次上讨论双缓存是什么样一个概念?说不定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上2010-02-24
修改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中。这样就实现了双缓冲了。2010-02-26
mengvlog 阅读 6 次 更新于 2025-07-20 11:39:42 我来答关注问题0
檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部