您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > 第13章Java多媒体
第13章多媒体技术Java语言不仅支持图形和文本媒体,同样支持图像、声音、动画及视频等其他多媒体,从而大大拓宽了其应用领域,使基于Java的应用更加丰富多彩,更具魅力。13.1图像处理Graphics类中提供了不少绘制图形的方法,但对于复杂图形,大部分都事先利用专用的绘图软件绘制好,或者是用其他截取图像的工具(如扫描仪、视效卡等)获取图像的数据信息,再将它们按一定的格式存入图像文件。Java程序运行时,将它装载到内存里,然后在适当的时机将它显示在屏幕上。13.1.1图像文件的装载Java目前所支持的图像文件格式只有两种,分别是GIF和JPEG格式(带有.GIF、.JPG、.JPEG后缀名的文件)。若是其他格式的图像文件,就先要将它们转换为这两种格式。能转换图像格式的软件有很多,如PhotoStyler等。Java特别提供了java.awt.Image类来管理与图像文件有关的信息,因此执行与图像文件有关的操作时需要import这个类。Applet类中提供了getImage()方法用来将准备好的图像文件装载到applet中,但我们必须首先指明图像文件所存储的位置。由于Java语言是面向网络应用的,因此文件的存储位置并不局限于本地机器的磁盘目录,而大部分情况是直接存取网络中Web服务器上的图像文件,因而,Java采用URL(UniversalResourceLocation,统一资源定位器)来定位图像文件的网络位置。1.URL类表示一个URL信息可分为两种形式:一种称为绝对URL形式,它指明了网络资源的全路径名。如:绝对URL:另一种称为相对URL形式,分别由基准URL(即baseURL)再加上相对于基准URL下的相对URL这两部分组成,例如上面的例子可表示为:基准URL:相对URL:images/m1.gif2.getImage()方法getImage()方法的调用格式有以下两种,这两种调用格式的返回值都是Image对象:ImagegetImage(URLurl)ImagegetImage(URLurl,Stringname)getImage()方法的第一种调用格式只需一个URL对象作为参数,这便是绝对URL。而后一种格式则带有两个参数,第一个参数给出的URL对象是基准URL,第二个参数是字符串类型,它描述了相对于基准URL下的路径和文件名信息,因此这两个参数的内容综合在一起就Java语言程序设计教程第第256构成了一个绝对URL。例如,下面两种写法所返回的结果是一样的:Imageimg=getImage(neURL());Imageimg=getImage(newURL(),images/m1.gif);表面看来,好像第一种调用格式较方便一些,但实际上第二种调用格式用得更普遍,因为这种格式更具灵活性。Applet类中提供了两个方法来帮助我们方便地获取基准URL对象,它们的调用格式如下:URLgetDocumentBase()URLgetCodeBase()其中getDocumentBase()方法返回的基准URL对象代表了包含该applet的HTML文件所处的目录,例如该文件存储在中,则该方法就返回路径。而getCodeBase()方法返回的基准URL对象代表了该applet文件(.class文件)所处的目录。它是根据HTML文件的APPLET标记中的CODEBASE属性值计算出来的,若该属性没有设置,则同样返回该HTML文件所处的目录。基准URL具有灵活性,只要我们写下语句:Imageimg=getImage(getDocumentBase(),images/m1.gif);那么,即使整个imgsample目录移到别处任何地方,也可以正确装载图像文件,而采用对于绝对URL形式,则需要重新修改applet代码并重新编译。13.1.2图像文件的显示getImage()方法仅仅是将图像文件从网络上装载进来,交由Image对象管理。而把得到的Image对象中的图像显示在屏幕上,则需要调用Graphics类的drawImage()方法,它能完成将Image对象中的图像显示在屏幕的特定位置上,就像显示文本一样方便。drawImage()方法的调用格式如下:booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)其中img参数就是要显示的Image对象,x和y参数是该图像左上角的坐标值,observer参数则是一个ImageObserver接口(interface),它用来跟踪图像文件装载是否已经完成的情况,通常我们都将该参数置为this,即传递本对象的引用去实现这个接口。除了将图像文件照原样输出以外,drawImage()方法的另外一种调用格式还能指定图像显示的区域大小:booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)这种格式比第一种格式多了两个参数width和height,即表示图像显示的宽度和高度。若实际图像的宽度和高度与这两个参数值不一样时,Java系统会自动将它进行缩放,以适合我们所定的矩形区域。有时,我们为了不使图像因缩放而变形失真,可以将原图的宽和高均按相同的比例进行缩小或放大。调用Image类中的两个方法就可以分别得到原图的宽度和高度,它们的调用格式如下:intgetWidth(ImageObserverobserver)intgetHeight(ImageObserverobserver)同drawImage()方法一样,我们通常用this作为observer的参数值。例13.1下面的程序段给出了一个显示图像文件的例子,其运行结果如图13-1所示。第第第13章多媒体技术257importjava.awt.Graphics;importjava.awt.Image;publicclassdrawimageextendsjava.applet.Applet{Imageimg;publicvoidinit(){img=getImage(getCodeBase(),boy.gif);//获取Image对象,加载图像}publicvoidpaint(Graphicsg){intw=img.getWidth(this);//获取图像的宽度inth=img.getHeight(this);//获取图像的高度g.drawImage(img,20,10,this);//原图g.drawImage(img,200,10,w/2,h/2,this);//缩小一半g.drawImage(img,280,10,w*2,h/3,this);//宽扁图g.drawImage(img,400,10,w/2,h*2,this);//瘦高图}}图13-1例13.1的效果图13.2声音文件的播放对声音媒体的直接支持可以说是Java的一大特色,尤其是在动画中配上声音效果,就可以使人在视觉上和听觉上均得到美的享受。Java中播放声音文件与显示图像文件一样方便,同样只需要先将声音文件装载进来,然后播放就行了。Java目前支持的声音文件格式有:AU格式(.AU文件),也称为u-law格式,AIFF、WAV以及三种MIDI文件格式(MIDI文件类型0、MIDI文件类型1,以及RMF)。Java提供两种播放声音的机制:Applet类的play()方法及AudioClip的play()方法。13.2.1Applet类的play()方法Applet类的play()方法可以将声音文件的装载与播放一并完成,其调用格式如下:voidplay(URLurl)voidplay(URLurl,Stringname)可见,play()方法的调用格式与getImage()方法是完全一样的,也采用URL来定位声音文件。例如,某声音文件audio.au与applet文件存放在同一目录下,可以这样写:play(getCodeBase(),audio.au);一旦play()方法装载了该声音文件,就立即播放。如果找不到指定URL下的声音文件,play()方法不返回出错信息,只是听不到想听的声音而已。13.2.2AudioClip的play()方法由于play()方法只能将声音播放一遍,若想循环播放某声音作为背景音乐,就需要用到功能更强大的AudioClip类,它能更有效地管理声音的播放操作。因为它被定义在java.appletJava语言程序设计教程第第258程序包中,所以需要在程序头部加上:importjava.applet.AudioClip;为了得到AudioClip对象,我们可以调用Applet类中的getAudioClip()方法。它能装载指定URL的声音文件,并返回一个AudioClip对象,其调用格式如下:AudioClipgetAudioClip(URLurl)AudioClipgetAudioClip(URLurl,Stringname)得到AudioClip对象以后,就可以调用AudioClip类中所提供的各种方法来操作其中的声音数据。AudioClip的主要方法见表13-1。表13-1AudioClip的主要方法方法功能loop()循环播放start()开始播放stop()停止播放如果getAudioClip()方法没有找到所指定的声音文件,就会返回null值。所以,应该先检查一下得到的AudioClip对象是不是null,因为在null对象上调用上述方法将导致出错。如果需要的话,我们还可以在applet中同时装载几个声音文件来一起播放,到时候,这些声音将混合在一起,就像二重奏一样。另外还有一点要说明的是,如果我们使用AudioClip对象的loop()方法来重复播放背景音乐时,要在适当的时候调用AudioClip对象的stop()方法来结束放音,否则的话,即使用户离开这一Web页面,该声音也不会停止。因此,一般都在applet的stop()方法中添上停止播放的代码。例13.2下面这段示例程序将播放两段声音,一段是连续播放的背景音乐,另一段是讲话录音。importjava.applet.AudioClip;publicclassAudiosextendsjava.applet.Applet{AudioClipbgmusic,speak;publicvoidinit(){bgmusic=getAudioClip(getDocumentBase(),space.au);speak=getAudioClip(getDocumentBase(),intro.au);}publicvoidstart(){if(bgmusic!=null)bgmusic.loop();if(speak!=null)speak.play();}publicvoidstop(){if(bgmusic!=null)bgmusic.stop();//关闭背景音乐}}13.2.3在JavaAplication中播放声音上面介绍的两种方法是在JavaApplet中播放声音,Java未提供在Application中播放声音的显示的支持,需要做额外的处理。第第第13章多媒体技术259因为AudioClip类及其getAudioClip()方法都属于java.applet包,所以它在Application中无法调用。解决的途径是使用一些Sun在JDK中发布但未正式注明的方法,即
本文标题:第13章Java多媒体
链接地址:https://www.777doc.com/doc-2242925 .html