Java知多少(101)图像缓冲技术

当图像信息量较大,采用以上直接显示的方法,可能前面一部分显示后,显示后面一部分时,由于后面一部分还未从文件读出,使显示呈斑驳现象。为了提高显示效果,许多应用程序都采用图像缓冲技术,即先把图像完整装入内存,在缓冲区中绘制图像或图形,然后将缓冲区中绘制好的图像或图形一次性输出在屏幕上。缓冲技术不仅可以解决闪烁问题,并且由于在计算机内存中创建图像,程序可以对图像进行像素级处理,完成复杂的图像变换后再显示。

【例 12-6】小应用程序程序演示图像缓冲显示技术。程序运行时,当鼠标在图像区域内按下时,图像会出现边框,托动鼠标时,图像也随之移动。抬起鼠标后,边框消失。程序将两种状态的图像先放入两个缓冲区,当鼠标拖动时,不断地在新的位置重绘鼠标按下样式的图像鼠标抬起时,重绘鼠标抬起样式的图像。

 1 鼠标抬起时,重绘鼠标抬起样式的图像。
 2 import java.applet.*;
 3 import java.awt.*;
 4 imprt java.awt.image. * ;
 5 import javax.swing.*;
 6 import java.event.*;
 7 public class Example7_6 extends Applet{
 8     Image myPicture;
 9     /*init()方法中,先定义一个Image对象,并赋予createImage()方法的返回值,接着创建Graphics对象并赋予其图形环境。最后,让Graphics对象调用drawImage()方法显示图像。
10 由于这里的Graphics对象offScreenGc是非屏幕对象是,小程序窗口不会有图像显示*/
11     public void init(){
12         myPicture = getImage(getCodeBase(), "myPic.JPG");
13         Image offScreenImage = createImage(size().width, size().height);
14         Graphics offScreenGc = offScreenImage.getGraphics();
15         new BufferedDemo(myPicture);
16     }
17     /*drawImage()方法的第四个参数是实现ImageObserver接口,在init()方法中,调用drawImage()方法的参数是this,所以小程序要定义imageUpdate()方法*/
18     public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){
19         if (infoFlg = ALLBITS){  // 表示图像已全部装入内存
20             repaint();
21             return false;// 防止线程再次调用imageUpdate()方法
22         }
23         else
24             return true;
25     }
26 }
27 /*程序的执行过程是,当小程序调用drawImage()方法时,drawImage()方法将创建一个调用 imageUpdate()方法的线程,在imageUpdate()方法中,测定图像是否已在部分调入内存。创建的线程不断调用imageUpdate()方法,直到该方法返回false为止。参数infoFlg使小程序能知道图像装入内存的情况。当infoFlg等于ALLBITS时,表示图像已全部装入内存。当该方法发现图像已全部装入内存后,置imageLoaded为真,并调用repaint()方法重画小程序窗口。方法返回false防止线程再次调用imageUpdate()方法。*/
28 class BufferedDemo extends JFrame{
29     public BufferedDemo(Image img){
30         this.getContentPane().add(new PicPanel(img));
31         setTile("双缓技术演示");
32         setSize(300, 300);
33         setVisible(true);
34     }
35 }
36 class PicPane extends JPanel implements MouseListener, MouseMotionListener{
37     int x = 0, y = 0, dx = 0, cy = 0;
38     BufferedImage bimg1, bimg2;
39     boolean upstate = true;
40     public picPanel(Image img){
41         this.setBackground(Color.white);
42         this.addMouseListener(this);
43         this.addMouseMotionListener(this);
44         bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this),
45         BufferedImage.TYPE_INT_ARGB);
46         bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this),
47         BufferedImage.TYPE_INT_ARGB);
48         Graphics2D g2D1 = bimg1.createGraphics();
49         Graphics2D g2D2 = bimg2.createGraphics();
50         g2D1.drawImage(img, 0, 0, this);
51         g2D2.drawImage(img, 0, 0, this);
52         g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3);
53     }
54     public void paintComponent(Graphics g){
55         super.painComponent(g);
56         Graphics2D g2D = (Graphics2D)g;
57         if (upState)
58             g2D.drawImage(bimg1, x, y, this);
59         else
60             g2D.drawImage(bimg2.x, y, this);
61     }
62     public void mousePress(MouseEvent e){
63         if (e.getX() >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){
64             upstate = false;
65             setCursor(Cursor.getPredefinedCursor(Coursor.HAND_CURSOR));
66             dx = e.getX() - x;
67             dy = e.getY() - y;
68             repain();
69         }
70     }
71     public void mouseExited(MouseEvent e){}
72     public void mouseClicked(MouseEvent e){}
73     public void mouseEntered(MouseEvent e){}
74     public void MouseReleased(MouseEvent e){
75         this.setCursor(Cursor.getpredefinedCursor(Cursor.DEFAULT_CURSOR));
76         upState = true;
77         repaint();
78     }
79     public void mouseMoved(MouseEvent e){}
80     public void mouseDragged(MouseEvent e){
81         if (!upState){
82             x = e.getX() - dx;
83             y = e.getY() - dy;
84             repaint();
85         }
86     }
87 }

程序要创建缓冲区图像,需要引入java.awt.image包中的BufferedImage类。要创建一个缓冲区图,可以调用createImage()方法,该方法返回一个Image对象,然后再将它转换成一个BufferedImage对象。例如,代码:

   BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());

也可利用以下构造方法来建立。

    BufferedImage(int width,int heigh, int imageType);

其中参数 imageType是图像类型。

使用缓冲区显示图像,需先在缓冲区中准备好图像,再将缓冲区中的图像显示在界面上。显示图像需要图形对象Graphics,可以通过以下方法建立:

    Graphics2D g2d = bimge.createGraphics();

系列文章:

Java知多少(上)

Java知多少(中)

Java知多少(78)Java向量(Vector)及其应用

Java知多少(79)哈希表及其应用

Java知多少(80)图形界面设计基础

Java知多少(81)框架窗口基础

Java知多少(82)标签、按钮和按钮事件简介

Java知多少(83)面板基础:JPanel和JScrollPane

Java知多少(84)图形界面之布局设计

Java知多少(85)文本框和文本区

Java知多少(86)文本框和文本区的输入输出

Java知多少(87)选择框和单选按钮

Java知多少(88)列表和组合框

Java知多少(89)列表和组合框

Java知多少(90)菜单

Java知多少(91)对话框

Java知多少(92)滚动条

Java知多少(93)鼠标事件

Java知多少(94)键盘事件

Java知多少(95)绘图基础

Java知多少(96)绘图之设置字型和颜色

Java知多少(97)绘图模式概述

Java知多少(98)Graphics类的绘图方法

Java知多少(99)Graphics2D类的绘图方法

Java知多少(100)图像处理基础

时间: 2024-10-12 16:46:06

Java知多少(101)图像缓冲技术的相关文章

Java知多少(完结篇)

Java知多少(1)语言概述 Java知多少(2)虚拟机(JVM)以及跨平台原理 Java知多少(3) 就业方向 Java知多少(4)J2SE.J2EE.J2ME的区别 Java知多少(5) Java开发环境的搭建 Java知多少(6)第一个程序示例 Java知多少(7)类与对象 Java知多少(8)类库及其组织结构 Java知多少(9) import及Java类的搜索路径 Java知多少(10)数据类型及变量 Java知多少(11)数据类型转换 Java知多少(12)运算符 Java知多少(1

Java知多少(110)数据库之插入记录

插入数据表记录有3种方案 一.使用Statement对象 实现插入数据表记录的SQL语句的语法是: insert into 表名(字段名1,字段名2,……)value (字段值1,字段值2,……) 例如: insert into ksInfo(考号,姓名,成绩,地址,简历)value(‘200701’,’张大卫’534,’上海欧阳路218弄4-1202’,’’) 实现同样功能的Java程序代码是: sql = “insert intoksIno(考号,姓名,成绩,地址,简历)”; sql= =

Java知多少(104)网络编程之统一资源定位符URL

统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址.超文本链路由统一资源定位符URL维持.URL的格式是: <METHOD>://<HOSTNAME:PORT>/<PATH>/<FILE> 其中:Method是传输协议:HOSTNAME是文档和服务器所在的Internet主机名(域名系统中DNS中的点地址);PORT是服务端口号(可省略):PATH是路径名,FILE是文件名.例

Java知多少(下)

Java知多少(78)Java向量(Vector)及其应用 Java知多少(79)哈希表及其应用 Java知多少(80)图形界面设计基础 Java知多少(81)框架窗口基础 Java知多少(82)标签.按钮和按钮事件简介 Java知多少(83)面板基础:JPanel和JScrollPane Java知多少(84)图形界面之布局设计 Java知多少(85)文本框和文本区 Java知多少(86)文本框和文本区的输入输出 Java知多少(87)选择框和单选按钮 Java知多少(88)列表和组合框 Ja

Java知多少(111)几个重要的java数据库访问类和接口

修改数据表记录也有3种方案. 一.使用Statement对象 实现修改数据表记录的SQL语句的语法是:    update表名 set 字段名1 = 字段值1,字段名2 = 字段值2,……where特定条件例如: update ksInfo set 姓名 = ‘张小卫’where 姓名 = ‘张大卫’ 先创建一个SQL语句,然砶调用Statement对象的executeUpdate()方法.例如, 1 sql = “update ksInfo set 姓名 = ‘”+txtName.getTex

Java知多少(108)数据库查询简介

利用Connection对象的createStatement方法建立Statement对象,利用Statement对象的executeQuery()方法执行SQL查询语句进行查询,返回结果集,再形如getXXX()的方法从结果集中读取数据.经过这样的一系列步骤就能实现对数据库的查询. [例 13-9]Java应用程序访问数据库.应用程序打开考生信息表ksInfo,从中取出考生的各项信息.设考生信息数据库的结构如下: 类型 字符串 字符串 整数 字符串 字符串 字段名 考号 姓名 成绩 地址 简历

Java知多少(102)多媒体基础

本节介绍 Java程序播放幻灯片和动画,播放声音和视频的方法. 播放幻灯片和动画 用实例说明播放幻灯片和动画的方法. [例 12-7]小应用程序先将幻灯片读入数组在存储,单击鼠标变换幻灯片,逐张显示. 1 import java.applet.*import java.awt.*; 2 import java.awt.event.*; 3 public class Example7_7 extends Applet implements MouseListener{ 4 final int nu

Java知多少(107)几个重要的java数据库访问类和接口

编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中用于管理数据库驱动程序的类.通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象: static Connection getConnection(String url,String username,Stri

Java知多少(103)网络编程之IP地址和InetAddress类

Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TCP/IP协议,它是Internet中各方所遵循的公共协议.TCP(Transport Control Protocol)是一种传输控制协议,IP(Internet Protocol)是一种网际协议,TCP/IP代表这两个协议的. TCP/IP分为四个层次: 网络接口层:负责接收和发送物理帧: 网络层