AWT多媒体编程上一节中我们着重讲解了AWT图形界面的开发,包括界面组件、布局和事件的处理,这些是最基本的图形界面开发的知识。依托于开发出来的图形界面,可以开发更多的多媒体的功能,例如音乐、视频、动画等。Sun开发的JDK也为多媒体功能的开发提供了多种工具包,包括图片处理、Java2D、Java3D、JavaSound、JMF等。本节课就来讲解各种媒体处理功能的开发和实现方法。Ø图像处理——java.awt.image:图像的加载、显示及简单的缩放处理。Ø二维图像绘制——Java2D:讲解二维图像的绘制过程,包括Graphics2D对象的取得、属性的设置、创建绘制对象、画图,然后通过3个实例展示绘制图形、文字、图像的过程。Ø音频录制与播放——JavaSound:讲解JavaSoundAPI的使用,包括音频的录制、播放、保存、格式等,并实战演练录音机程序和MP3音乐播放器的开发。Ø视频拍照与播放——JMF多媒体库:讲解JMF的基本模型、播放器Player的创建、视频的捕获过程,并实战演练视频拍照程序和视频播放器的开发。17.1图像处理——java.awt.imageAWT对图像使用的支持库分布于java.awt和java.awt.image包中,java.awt.image包提供可用于创建、操纵和观察图像的接口和类。每一个图像都用一个java.awt.Image对象表示。除了Image类外,java.awt包还提供了其他的基本的图像支持,例如Graphics类的drawImage()方法,Toolkit对象的getImage()方法及MediaTracker类。在java.applet包中,Applet类的getImage()方法使得Applet可以很容易地使用URL加载图像。下面我们来讲解图片加载和显示的方法,并通过两个实例演示显示图片和缩放的过程。17.1.1加载图像AWT可以很简单地加载两种格式的图像:GIF和JPEG。Toolkit类提供了两个getImage()方法来加载图像。ØImagegetImage(URLurl)。ØImagegetImage(Stringfilename)。Toolkit是一个组件类,取得Toolkit的方法是:Toolkittookkit=Toolkit.getDefaultToolkit();对于继承了Frame的类来说,可以直接使用下面的方法取得:Toolkittookkit=getToolkit();下面是两个加载图片的实例:Toolkittoolkit=Toolkit.getDefaultToolkit();Imageimage1=toolkit.getImage(imageFile.gif);Imageimage2=toolkit.getImage(newURL());如果你的类是Applet,此时可以使用Applet的两个getImage()方法用来直接加载图片:ImagegetImage(URLurl);ImagegetImage(URLurl,Stringname);下面的代码演示了如何使用Applet的getImage()方法。getCodeBase()是Applet取得网络路径的方法。Imageimage1=getImage(getCodeBase(),imageFile.gif);Imageimage2=getImage(getDocumentBase(),anImageFile.jpeg);Imageimage3=getImage(newURL());17.1.2显示图像通过传递到paint()方法的Graphics对象可以很容易地显示图像。Graphics类声明了下面的4个drawImage()方法。它们都返回一个boolean值,虽然这个值很少被使用。如果图像已经被完全加载并且因此被完全绘制,返回值是true;否则,返回值是false。booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)booleandrawImage(Imageimg,intx,inty,Colorbgcolor,ImageObserverobserver)booleandrawImage(Imageimg,intx,inty,intwidth,intheight,Colorbgcolor,ImageObserverobserver)drawImage()方法有下面的参数。ØImageimg;:需要绘制的图像。Øintx,inty;:图像左上角坐标。Øintwidth,intheight;:图像的宽度和高度(单位为像素)。ØColorbgcolor;:图像下面的颜色。如果图像包含透明像素时这会有用,图像将在指定颜色背景下显示。ØImageObserverobserver;:一个实现ImageObserver接口的对象。它将该对象登记为一个图像观察者,因此当图像的任何新信息可见时它被通知。大多组件可以简单地指定this。组件可以指定this作为图像观察者的原因是,Component类实现了ImageObserver接口。当图像数据被加载时,它的实现会调用repaint()方法。例如下面的代码在组件区域的左上角(0,0)以原始大小显示一个图像:g.drawImage(myImage,0,0,this);下面的代码在坐标(90,0)处显示一个被缩放为宽300像素高62像素的图像:g.drawImage(myImage,90,0,300,62,this);17.1.3实例一:显示图片下面我们来编写一个窗体,用来加载图像并进行显示。该类继承自Frame,因此可以直接使用getToolkit()方法来取得Toolkit对象,然后使用getImage()来取得一张本地图片文件,最后在paint()中使用Graphics的drawImage()即可显示该图像。实现的类代码如程序17-1所示。程序17-1ShowImage.javapackagecom.test.image;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Image;publicclassShowImageextendsFrame{Stringfilename;publicShowImage(Stringfilename){setSize(470,350);setVisible(true);this.filename=filename;}publicvoidpaint(Graphicsg){//取得图片对象Imageimage=getToolkit().getImage(filename);//画图g.drawImage(image,0,0,this);}publicstaticvoidmain(Stringargs[]){newShowImage(D:/workspace3.4/javamedia/src/com/test/image/test.jpg);}}运行该程序的显示效果如图17-1所示。图17-1ShowImage.java显示效果17.1.4实例二:缩放图片通过getImage()方法取得的是java.awt.Image类型的对象,也可以使用javax.imageio.ImageIO类的read()取得一个图像,返回的是BufferedImage对象。BufferedImageImageIO.read(Url);BufferedImage是Image的子类,它描述了具有可访问图像数据缓存区的Image。我们可以通过该类来实现图片的缩放。下面的实例首先读入一个图片文件,然后根据Image的getWidth()和getHeight()方法取得图片的宽度和高度,然后按照该宽度和高度的一半构造新的图片对象BufferedImage,并将原有的图片写入到该实例中,即可实现图片的缩小。最后通过JPEG编码保存图片,如程序17-2所示。程序17-2ZoomImage.javapackagecom.test.image;importjava.io.File;importjava.io.FileOutputStream;importjava.awt.Image;importjava.awt.image.BufferedImage;importcom.sun.image.codec.jpeg.JPEGCodec;importcom.sun.image.codec.jpeg.JPEGImageEncoder;publicclassZoomImage{publicvoidzoom(Stringfile1,Stringfile2){try{//读入图片File_file=newFile(file1);Imagesrc=javax.imageio.ImageIO.read(_file);//构造Image对象intwidth=src.getWidth(null);//得到图宽intheight=src.getHeight(null);//得到图长//图片放缩BufferedImagetag=newBufferedImage(width/2,height/2,BufferedImage.TYPE_INT_RGB);tag.getGraphics().drawImage(src,0,0,width/2,height/2,null);//绘制缩小后的图//写入图片FileOutputStreamout=newFileOutputStream(file2);//输出到文件流JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);encoder.encode(tag);//JPEG编码out.close();}catch(Exceptione){}}publicstaticvoidmain(Stringargs[]){Stringfile1=D:/workspace3.4/javamedia/src/com/test/image/test.jpg;Stringfile2=D:/workspace3.4/javamedia/src/com/test/image/testzoom.jpg;newZoomImage().zoom(file1,file2);}}运行该程序,即可生成缩小后的testzoom.jpg。如果大家对图像处理有更高的要求,不妨关注一下开源项目。比如JMagick,可以使用JMagick来实现图片的复制、信息获取、斜角、特效、组合、改变大小、加边框、旋转、切片、改变格式、去色等功能。17.2二维图像绘制——Java2D在上一节中我们已经学会了使用Graphics来显示一张图片,但它java.awt.image提供的图像处理功能比较简单,因此就出现了Java2D的图像库。Java2DAPI增强了AWT的图形、文本和图像处理能力,使你能开发富客户界面和新类型的Java应用程序。下面我们首先简单介绍Java2D的功能和API,然后讲解Java2D的绘图过程。(1)取得Graphics2D对象。(2)设置Graphics2D属性。(3)创建绘制对象。(4)绘制对象。最后通过3个实例,演示使用Java2D显示图形、文字和图片的方法。17.2.1Java2D简介Java2DAPI是JFC(JavaFundationClasses)的一员,它加强了传统AWT的描绘功能。通过使用Java2DAPI,可以轻松地描绘出任意的几何图形、运用不同的填色效果、对图形进行