软件编程
位置:首页>> 软件编程>> java编程>> 举例解析Java的图像缓冲技术的使用

举例解析Java的图像缓冲技术的使用

作者:goldensun  发布时间:2022-09-08 17:17:17 

标签:Java,图像缓冲

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

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


import java.applet.*;
import java.awt.*;
imprt java.awt.image. * ;
import javax.swing.*;
import java.event.*;
public class Example7_6 extends Applet{
 Image myPicture;
 /*init()方法中,先定义一个Image对象,并赋予createImage()方法的返回值,接着创建Graphics对象并赋予其图形环境。最后,让Graphics对象调用drawImage()方法显示图像。
由于这里的Graphics对象offScreenGc是非屏幕对象是,小程序窗口不会有图像显示*/
 public void init(){
   myPicture = getImage(getCodeBase(), "myPic.JPG");
   Image offScreenImage = createImage(size().width, size().height);
   Graphics offScreenGc = offScreenImage.getGraphics();
   new BufferedDemo(myPicture);
 }
 /*drawImage()方法的第四个参数是实现ImageObserver接口,在init()方法中,调用drawImage()方法的参数是this,所以小程序要定义imageUpdate()方法*/
 public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){
   if (infoFlg = ALLBITS){ // 表示图像已全部装入内存
     repaint();
     return false;// 防止线程再次调用imageUpdate()方法
   }
   else
     return true;
 }
}
/*程序的执行过程是,当小程序调用drawImage()方法时,drawImage()方法将创建一个调用 imageUpdate()方法的线程,在imageUpdate()方法中,测定图像是否已在部分调入内存。创建的线程不断调用imageUpdate()方法,直到该方法返回false为止。参数infoFlg使小程序能知道图像装入内存的情况。当infoFlg等于ALLBITS时,表示图像已全部装入内存。当该方法发现图像已全部装入内存后,置imageLoaded为真,并调用repaint()方法重画小程序窗口。方法返回false防止线程再次调用imageUpdate()方法。*/
class BufferedDemo extends JFrame{
 public BufferedDemo(Image img){
   this.getContentPane().add(new PicPanel(img));
   setTile("双缓技术演示");
   setSize(300, 300);
   setVisible(true);
 }
}
class PicPane extends JPanel implements MouseListener, MouseMotionListener{
 int x = 0, y = 0, dx = 0, cy = 0;
 BufferedImage bimg1, bimg2;
 boolean upstate = true;
 public picPanel(Image img){
   this.setBackground(Color.white);
   this.addMouseListener(this);
   this.addMouseMotionListener(this);
   bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this),
   BufferedImage.TYPE_INT_ARGB);
   bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this),
   BufferedImage.TYPE_INT_ARGB);
   Graphics2D g2D1 = bimg1.createGraphics();
   Graphics2D g2D2 = bimg2.createGraphics();
   g2D1.drawImage(img, 0, 0, this);
   g2D2.drawImage(img, 0, 0, this);
   g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3);
 }
 public void paintComponent(Graphics g){
   super.painComponent(g);
   Graphics2D g2D = (Graphics2D)g;
   if (upState)
     g2D.drawImage(bimg1, x, y, this);
   else
     g2D.drawImage(bimg2.x, y, this);
 }
 public void mousePress(MouseEvent e){
   if (e.getX() >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){
     upstate = false;
     setCursor(Cursor.getPredefinedCursor(Coursor.HAND_CURSOR));
     dx = e.getX() - x;
     dy = e.getY() - y;
     repain();
   }
 }
 public void mouseExited(MouseEvent e){}
 public void mouseClicked(MouseEvent e){}
 public void mouseEntered(MouseEvent e){}
 public void MouseReleased(MouseEvent e){
   this.setCursor(Cursor.getpredefinedCursor(Cursor.DEFAULT_CURSOR));
   upState = true;
   repaint();
 }
 public void mouseMoved(MouseEvent e){}
 public void mouseDragged(MouseEvent e){
   if (!upState){
     x = e.getX() - dx;
     y = e.getY() - dy;
     repaint();
   }
 }
}

程序要创建缓冲区图像,需要引入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();
0
投稿

猜你喜欢

  • 一、单线程扫描1.代码using System;using System.Windows.Forms;using System.Net;us
  • 在研究性能的时候,完全可以使用Stopwatch计时器计算一项技术的效率。但是有时想知道某想技术的性能的时候,又常常想不起可以运用Stopw
  • 上标是指比同一行中其他文字稍高的文字,而下标是指比同一行中其他文字稍低的文字。在生活中,我们常见的平方米、立方米等符号以及化学中的各种元素符
  • 一、带时区的时间1.获取当前时间对象(带时区)import java.time.ZonedDateTime;public class dem
  • 本文实例为大家分享了java实现拼图游戏的具体代码,供大家参考,具体内容如下游戏说明:设计一款拼图游戏,要求点击图片按钮,实现图片按钮的移动
  • 这个应该是简易版的美图秀秀(小伙伴们吐槽:你这也叫简易版的??我们看着怎么不像啊……)。好吧,只是在图片上绘制涂鸦,然后保存。一、选择图片这
  • 本文实例为大家分享了C#实现QQ聊天窗口的具体代码,供大家参考,具体内容如下分析需要两个TextBox,一个用于显示消息,一个用于编辑消息需
  • Java Object.getClass()方法Object.getClass()方法,这个方法的返回值是Class类型,Class c =
  • 斗地主规则:1. 组装54张扑克牌2. 将54张牌顺序打乱3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。4. 查看三
  • 本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下关键思想:1.抢红包涉及多人并发操作,需要做好同步保证多线程运
  • 🌱1. 什么是反射机制?首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java
  • private void btnSave_Click(object sender, RoutedEventArgs e)  
  • 有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。代码如下,很简单,相信大家都能看懂,我就不赘述了。usin
  • 很多时候,我们需要使用C#中的WebClient 来收发数据,WebClient 类提供向 URI 标识的任何本地、Intranet 或 I
  • 本文实例为大家分享了Java编写实现九宫格应用的具体代码,供大家参考,具体内容如下在九宫格里面轮流画圈或叉,哪一方先在水平、竖直、或对角线上
  • 引言热修复技术如今已经不是一个新颖的技术,很多公司都在用,而且像阿里、腾讯等互联网巨头都有自己的热修复框架,像阿里的AndFix采用的是ho
  • 本文实例为大家分享了Android自定义带圆点的半圆形进度条,供大家参考,具体内容如下仅限用于半圆形,如须要带圆点的圆形进度条,圆点会出现错
  •      在开发过程中,碰到生成一个List对象,需要对其里面的每个对象都进行校验。但是,这个Lis
  • 先直接看看效果吧初始情况 点击一个作为标记 再次点击后删除 3.这里还要感谢前辈的代码作为参考,毕竟以前也没有写过关于日历方面的东西,别人确
  • 一,背景之所以会想到一个服务同时使用eureka和nacos,是因为遇到一个需求,配置数据是存储在nacos的配置中,然后使用该配置的服务却
手机版 软件编程 asp之家 www.aspxhome.com