java 如何用BufferedImage画出图像
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
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();
}
}
我是想把这张图像先画到内存中去,再从内存中画到Jframe上, 我知道可以直接画IMG 我的意思是说用双缓存 技术,以后好处理多张图片 展开
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();
}
}
另外呢,你要把图像画到内存中,那就是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-26
连paint的参数g都没用到,你能画到JFrame上?你所有的drawimage都是对Image对象处理,和组件的绘制一点关系也没。。
简单的说,你做的就是新建一幅图,我称为newImage吧,把原来的图,我称为image,先画进去,然后再把newImage的图再画到image里面去。对于int a来说,你做的就是这样:
int b = a;
a = b;
这样做的不是缓存,而是缓冲。缓存是指存着以后要用的东西提高效率,缓冲则是指在某个地方停一停,做一些冗余的事情,是一种降低速度的行为。
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中。这样就实现了双缓冲了。