第6讲图像像素点的处理课件_第1页
第6讲图像像素点的处理课件_第2页
第6讲图像像素点的处理课件_第3页
第6讲图像像素点的处理课件_第4页
第6讲图像像素点的处理课件_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6讲图像像素点的处理教学目标与要求:了解图像处理的原理以及双缓冲技术了解Java捕获屏幕图像的原理教学重点、难点:1.教学重点:图像处理的原理图像处理具体执行步骤双缓冲技术如何捕获屏幕图像2.教学难点:应用双缓冲技术进行图像处理提问:当我们成功地加载和显示图像,对所得到的图像的显示效果并不满意的情况下,我们将采取什么的方式来解决,以达到我们想要的显示效果呢?6.1图像处理的原理获取加载了的图像所有像素值,对这些像素值进行相应的处理之后,重构一个新的图像。图像处理的方法有:图像变换、图像编码、图像压缩、图像解码等等。6.2图像处理具体执行步骤为:使用MediaTracker类加载图像实例化PixelGrabber类使用其grabPixels()方法抓取图像像素,生成了图像像素数组对这个数组进行各种变换通过MemoryImageSource类将数组中的像素值重构一个新的图像使用paint()将新的图像显示出来(1)MediaTracker类是一个跟踪多种媒体对象状态的实用工具类。媒体对象可以包括音频剪辑和图像,但目前仅支持图像。要使用媒体跟踪器,需要创建一个MediaTracker

实例调用addImage()方法向此媒体跟踪器正在跟踪的图像列表添加一个图像。另外,还可以为每个图像分配一个惟一的标识符,此标识符可控制获取图像的优先级顺序。调用waitForID()方法开始加载由此媒体跟踪器跟踪且具有指定标识符的所有图像。

其创建格式如下:

MediaTrackertracker1=newMediaTracker(this);

img=Toolkit.getDefaultToolkit().getImage("a.jpg");//其中0为图像的标识符tracker1.addImage(img,0);//加载由此媒体跟踪器跟踪且标识符为0的图像try{tracker1.waitForID(0);}

catch(InterruptedExceptione){}(2)实例化PixelGrabber类,提供了三种不同的构造方式:PixelGrabber(Image

img,int

x,int

y,int

w,int

h,boolean

forceRGB)

创建一个PixelGrabber

对象,以便从指定的图像中抓取像素矩形部分(x,y,w,h)。forceRGB为像素的传递方式,其值为true时,表示以RGB方式传递像素;其值为false时,表示以图像构造器方式传递像素。

PixelGrabber(Image

img,int

x,int

y,int

w,int

h,int[]

pix,int

off,int

scansize)

创建一个PixelGrabber

对象,以便从指定的图像中将像素矩形部分(x,y,w,h)抓取到给定的数组中。Off为存放第一个像素的位置,通常取0;scansize为每行的像素个数,即图像的宽度。

PixelGrabber(ImageProducer

ip,int

x,int

y,int

w,int

h,int[]

pix,int

off,int

scansize)

创建一个PixelGrabber

对象,以便从指定ImageProducer(图像构造器)所生成的图像中将像素矩形部分(x,y,w,h)抓取到给定的数组中。(3)PixelGrabber类的对象调用grabPixels()方法将抓取到的图像像素存入数组中,注意要使用try-catch结构。(4)针对该数组中的像素值,对其进行各种变换,以达到我们处理图像的目的。比如,可对其RGB值和Alpha值重新计算和赋值,从而得到一个具有不同透明度与颜色值的像素数组。(5)通过MemoryImageSource类构造一个使用变换过的数组为Image对象生成数据的ImageProducer对象imgprd,调用createImage(imgprd)方法便可产生一个新图像。MemoryImageSource类创建格式如下:ImageProducer

MemoryImageSource(int

w,int

h,int[]

pix,int

off,int

scan)

构造一个使用默认RGBColorModel

中的整数数组为Image对象生成数据的ImageProducer

对象。(6)通过paint()即可将新图像显示出来应用示例:Image1.java(本程序为改变图像的透明值)6.3双缓冲技术缓冲是在内存或显存中开辟一块与屏幕一样大小的存储区域,作为缓冲屏幕。将下一帧要显示的图像绘制到这个缓冲屏幕上面,在显示的时候将虚拟屏幕中的数据复制到可见视频缓存区里面去。

在Java程序中要实现这个技术,首先在缓冲区建立一个绘制图像的Graphics对象,进行paint()的操作,当完成了以后再把它显示到屏幕上,由于从缓冲区读取数据的速度很快,就不会出现闪烁了。

双缓冲技术优缺点:优点:图形绘制过程是在不可见的虚拟屏幕中进行,所以可以消除屏幕的闪烁。缺点:在显示的时候将虚拟屏幕中的数据复制到可见视频缓存区里面去,由于要复制大量的数据,速度可能就会慢一些。如何使用双缓冲建立图像缓冲区?其创建方式如下所示:try{

img=createImage(800,600);//建立图像对象缓冲区

graphics=img.getGraphics();//得到绘制图像的graphics对象

}catch(NullPointerExceptione){}graphics.drawImage(cropped,0,30,this);//在屏幕外的缓冲区中绘

//制图像

g.drawImage(img,0,0,this);//在屏幕上显示图像

}

6.4Java捕获屏幕图像的原理“捕获屏幕图像”是比较接近操作系统底层的操作,这里我们提供一个“机器人”Robot类,该类用于产生与本地操作系统有关的底层输入、测试应用程序运行或自动控制应用程序运行。Robot类提供一个createScreenCapture()方法,可以直接将全屏幕或某个屏幕区域的像素复制到一个BufferedImage对象中,只需要将该对象写入到一个图像文件中,就完成了屏幕到图像的复制过程。(1)Robot类createScreenCapture()方法的创建格式如下:BufferedImage

createScreenCapture(Rectangle

screenRet)将指定矩形区域内的屏幕像素复制下来产生一个BufferedImage对象。(2)Robot类应用的主代码段如下:

Robotrobot=null;try{robot=newRobot();}catch(Exception

er){}RectanglescreenRect=null;

intwidth=getToolkit().getScreenSize().width;

intheight=getToolkit().getScreenSize().height;

screenRect=newRectangle(0,0,width,height);//将指定矩形区域内的屏幕像素复制下来产生一个BufferedImage对象BufferedImageimage=robot.createScreenCapture(screenRect);//创建一个图像文件Filefile=newFile("ScreenCapture.jpg");

//将截取到的屏幕图像写到图像文件file中

javax.imageio.ImageIO.write(image,"jpg",file);

repaint();…publicvoidpaint(Graphicsg){g.drawImage(image,0,0,800,600,this);}(3)应用示例:MakeJPEG.java(应用Robot类捕获屏幕图像)教学总结:

1.掌握应用双缓冲技术进行图像处理,以及了解双缓冲技术优缺点。2.了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论