第11章---Java在多媒体中的应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第9章Java在多媒体中的应用第9章Java在多媒体中的应用9.4图像处理9.5动画图像处理第9章Java在多媒体中的应用9.4图像处理正如上一节所介绍的,Graphics类中确实提供了不少绘制图形的方法,但如果用它们在Applet运行过程中实时地绘制一幅较复杂的图形,就好比是在用斧头和木块去制造航天飞机。因此,对于复杂图形,一般都事先用专用的绘图软件将其绘制好,或者是用其他截取图像的工具(如扫描仪、视效卡等)获取图像的数据信息,再将它们按一定的格式存入图像文件中。程序运行时,只要找到图像文件存贮的位置,将它装载到内存里,然后在适当的时机将它显示在屏幕上就可以了。第9章Java在多媒体中的应用9.4.1加载和显示图像在AWT中,java.awt.image类用于描述图像,它通过传递一个Image类对象的引用给Graphics.drawImage(Image,int,int,ImageObserver)方法,就可以将图像在画布(Canvas)或是其他可视组件中显示出来。第9章Java在多媒体中的应用Java目前所支持的图像文件格式只有两种,分别是GIF和JPEG格式(带有.GIF、.JPG、.JPEG后缀名的文件)。因此,若图像文件是其他格式,就须先将它们转换为这两种格式。java.awt.image是一个抽象类,它定义的方法提供对图像信息的访问。下面通过一个例子来看看如何利用Image类来显示一幅图像。第9章Java在多媒体中的应用例9.8ImageTestApplication.javaimportjava.awt.*;importjava.awt.event.*;publicclassImageTestApplicationextendsFrame{Insetsinsets;Imageim;staticpublicvoidmain(Stringargs[]){ImageTestApplicationapp=newImageTestApplication();第9章Java在多媒体中的应用app.show();}publicImageTestApplication(){super(ImageTest);im=Toolkit.getDefaultToolkit().getImage(tiger.gif);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevent){dispose();System.exit(0);}});}第9章Java在多媒体中的应用publicvoidaddNotify(){super.addNotify();//peeriscreatedhereinsets=getInsets();setBounds(100,100,217+insets.left,321+insets.top);}publicvoidpaint(Graphicsg){g.drawImage(im,insets.left,insets.top,this);System.out.println(drawingimage...);System.out.println(g.drawImage(im,insets.left,insets.top,this));}}第9章Java在多媒体中的应用在应用程序中加载图像必须调用Toolkit类的静态方法getImage(),该方法返回一个指定图像文件的Image对象描述,然后在paint()方法中调用Graphics类的drawImage()方法,就可以将图片显示在当前容器中。第9章Java在多媒体中的应用需要注意的是addNotify()方法,覆盖这个方法是为了得到框架窗口空白区域的引用,并用它来设置框架窗口的大小。这样做是因为框架窗口的左上角(0,0)坐标是从标题栏开始计算的,如果将图从(0,0)开始画,空白区域以外(即标题栏覆盖的部分)将会被裁减,所以必须从坐标(insets.left,insets.top)的位置开始画图。程序的运行结果如图9.8所示。第9章Java在多媒体中的应用图9.8第9章Java在多媒体中的应用在上面的例子中,查看控制台会发现,paint()方法被调用了很多次,这是因为getImage()方法是启动一个线程来加载图像的,所以paint()方法被调用的时候不一定已经载入了整张图片,每次只绘出已经加载的部分。第9章Java在多媒体中的应用Java这样采用线程的做法虽然会提高性能,但是也为编程带来了一些问题。例如,上例中的setBounds()方法中的尺寸是硬编码(直接写入数值)的,这种方法缺乏通用性,是明确不被推荐的做法。较好的方法是直接取图像的尺寸,通过调用Image.getWidth()和Image.getHeight()方法可以做到。因为在图像被完全加载以前,它们的返回值都是-1,所以要等到图像加载完才能调用它们。第9章Java在多媒体中的应用如何知道图像有没有被加载完呢?AWT包为此提供了MediaTracker类用于监控图像的加载过程。使用MediaTracker类分为三步:(1)创建MediaTracker对象。(2)使用MediaTracker.addImage()指明要监控的图像对象。(3)创建try/catch块,等待和指定与ID相关的图像被完全加载。现在采用MediaTracker类来改写上面的例子。第9章Java在多媒体中的应用例9.9ImageTestApplication.javaimportjava.awt.*;importjava.awt.event.*;publicclassImageTestApplicationextendsFrame{Insetsinsets;Imageim;intwidth,height;staticpublicvoidmain(Stringargs[]){ImageTestApplicationapp=newImageTestApplication();第9章Java在多媒体中的应用app.show();}publicImageTestApplication(){super(ImageTest);MediaTrackertracker=newMediaTracker(this);im=Toolkit.getDefaultToolkit().getImage(tiger.gif);tracker.addImage(im,0);try{tracker.waitForID(0);}catch(InterruptedExceptione){e.printStackTrace();}width=im.getWidth(this);height=im.getHeight(this);第9章Java在多媒体中的应用addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevent){dispose();System.exit(0);}});}publicvoidaddNotify(){super.addNotify();//peeriscreatedhereinsets=getInsets();setBounds(100,100,width+insets.left,height+insets.top);}第9章Java在多媒体中的应用publicvoidpaint(Graphicsg){g.drawImage(im,insets.left,insets.top,this);System.out.println(drawingimage...);System.out.println(g.drawImage(im,insets.left,insets.top,this));}}再来看看控制台,可以看到paint()方法只被执行了一次。这说明图像是被完全加载以后才调用paint()方法显示的。第9章Java在多媒体中的应用9.4.2图像生成AWT除了提供用于描述图像的java.awt.image类外,还提供了用于图像处理的java.awt.image包,这个包的所有类几乎都和生产和消费图像有关。图像生产者负责产生图像的位,而图像消费者用于接收图像的位。注:用于描述图像的是java.awt包中的Image类,它为图像提供引用,而java.awt.image包中的类则用于图像处理,不要将它们混淆。第9章Java在多媒体中的应用在java.awt.image包中,提供了图像源生产者接口ImageProducer,以及用于像素抓取和图像过滤器的消费者接口ImageConsumer。实际上,和图像相关联的位并不存在java.awt.image中,而是每个图像都和一个ImageProducer接口相关联,这个ImageProducer真正负责生产图像的位。第9章Java在多媒体中的应用AWT组件除了可以显示图像,还可以创建图像。要生成一幅图像就必须调用AWT组件类提供的方法createImage(ImageProducer)或CreateImage(intwidth,intheight)。第一个方法通过给定一个提供图像位的ImageProducer参数来创建图像;第二个方法则通过指定图像大小来生成图像。第9章Java在多媒体中的应用此外,java.awt.Toolkit类也拥有创建图像的能力。它提供了三种创建图像的方法:①createImage(ImageProducer)②createImage(byte[]bits)③createImage(byte[]bits,intoffset,intlength)和AWT一样,Toolkit类在创建图像时,也可以通过给定一个ImageProducer参数来实现。另外,它还提供了两种方法,从一个byte数组创建图像,该方法是使用位数组创建图像,即我们常用的内存图像。第9章Java在多媒体中的应用9.4.3图像处理在AWT中,提供了大量的方法支持图像处理,特别是在java.awt.image包中,为我们提供了一些十分有用的图像过滤器。这一节将向大家介绍如何使用这些奇妙的图像过滤器。前面已经提到,生产者接口ImageProducer用于产生图像位并把它们传递给图像消费者。对于每个Image对象,都有一个和它对应的图像生产者,其作用是用来重构图像和生产随时需要的图像位。第9章Java在多媒体中的应用图像生产者保持一个图像消费者列表,他们得到的图像数据都来自图像生产者。ImageProducer接口提供用来在列表中增加或删除图像消费者的方法,而且同时还用于判断一个消费者是否已经向生产者注册。在java.awt.image软件包中,有两个类实现ImageProducer接口,它们是:FilteredImageSource类和MemoryImageSource类。第9章Java在多媒体中的应用图像消费者ImageConsumer接口用于从图像生产者接收图像数据,java.awt.image包中也提供了两个类实现ImageConsumer接口,它们是:ImageFilter类和PixelGrabber类。下面我们来介绍如何使用java.awt.image包中的图像处理工具——图像过滤器。java.awt.image包提供了下面几种图像过滤器:●CorpImageFilter:从一副已知图像中裁剪出一个特殊的矩形,要裁剪的矩形形状由过滤器的构造器来决定。第9章Java在多媒体中的应用●ReplicateScaleFilter:使用一个简单的算法缩放图像,例如复制图像数据的行或列进行放大;删除图像数据的行或列进行缩小。●AreaAveragingScaleFilter:是ReplicateScaleFilter的一个扩展,它在缩放时采用了一个比较高级的算法。两者的使用方式相同,但AreaAveragingSealeFilter

1 / 65
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功