多媒体编程知识

上传人:花****园 文档编号:242940975 上传时间:2024-09-12 格式:PPT 页数:67 大小:963KB
返回 下载 相关 举报
多媒体编程知识_第1页
第1页 / 共67页
多媒体编程知识_第2页
第2页 / 共67页
多媒体编程知识_第3页
第3页 / 共67页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第11章 多媒体编程,11.1,图像处理,11.2,动画处理,11.3,数字音频,习题,中国最庞大的数据库下载,11.1 图像处理,Java,支持两种图像格式,JPEG,和,GIF。,11.1.1 图像种类,1.,BMP,BMP,是,Windows,的标准位图文件格式,含有固定数量的像素点颜色,可用,Windows,的画图程序打开。这种图像在放大时,会出现锯齿边缘,变得很不清晰。图像文件没有被压缩过,规模较大,不适合在,Internet,上使用,,Java,不能显示这种图像。,中国最庞大的数据库下载,2.JPEG,或,JPG,JPEG,称为联合图像专家组(,joint photographic experts group),,可用浏览器打开。,JPEG(,或,JPG),图像格式一般用来显示照片和具有连续色调的图像,它能保存图像所有颜色信息。,JPEG,是一种压缩的文件格式,在打开时自动解压缩。由于压缩后的文件规模较小,成为,Internet,上广泛使用的图像格式,,Java,可以显示这种图像。,3.,GIF,GIF,称为图像交换格式(,graphic interchange format),,可用浏览器打开。,GIF,图像是一种压缩文件格式,由于它能最大限度地减少文件转换时间,所以在,HTML,文件中常用于显示插图或图标。,GIF,格式能有效减少文件大小,有利于在,Internet,上使用,,Java,支持这种图像格式。,图11.1,11.1.2 图像的显示,例11.1在,Applet,中显示一幅图像,如图11.1所示,。,import java.applet.Applet;,import java.awt.Image;,import java.awt.Graphics;,public class ShowImage extends Applet ,Image img;,public void init(),img=getImage(getCodeBase(),bld.jpg);,public void paint(Graphics g),g.drawImage(img,30,10,this);,1.,加载图像,加载图像一般放在初始化方法,init,中进行。程序中的,getImage,方法可加载,Java,支持的图像文件,它有两个参数,一个是图像文件地址,一个是图像文件名称。由于,Applet,是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分情况是直接读取,Web,服务器上的图像文件。,getImage,方法返回一个,Image,对象,它的调用格式为:,Image getImage(URL url),Image getImage(URL url, String name),其中,url,是一个,URL,类的对象,代表一个网络地址(关于,URL,的概念请参考下一章的内容),例如下面的语句可以加载,sun,公司,Web,服务器指定位置上的一幅图片:,getImage (new URL( drawImage(Image img, int x, int y, ImageObserver observer),boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer),其中,img,就是要显示的图像、,x,和,y,是图像显示位置(,x,和,y,可取负值,表示一部分图像被移出了显示区)、,bgcolor,是图像显示区域的背景色、,observer,是图像加载跟踪器,通常将该参数指定为,this,,即由,Applet,负责跟踪图像的加载情况。,这两种方法都是将图像照原样显示,能不能对图像进行缩放呢?使用下面两种调用格式就可以对图像进行缩放显示:,boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer),boolean drawImage(Image img, int x, int y, int w, int h, Color c, ImageObserver observer),图11.2,例11.2图像的缩放显示,如图11.2所示。,import java.awt.*;,import java.applet.*;,public class ShowImage1 extends Applet ,Image img;,public void init(),img=getImage(getCodeBase(),ball.jpg);,public void paint(Graphics g),int w=img.getWidth(this);,int h=img.getHeight(this);,g.drawImage(img,20,40,this);/,原图,g.drawImage(img,120,70, w/2, h/2, this);/,缩小一倍,g.drawImage(img,160,0, w*2, h*2, this);/,放大一倍,上述程序加载了一个圆球图像,在,paint,方法中调用,getWidth,和,getHeight,方法取得图像的宽度和高度。然后分别显示了原图、缩小一倍和放大一倍的图像。,11.1.3,幻灯机效果,如果,Applet,仅仅是显示一幅图像,没有什么特别的意义,不如直接在,HTML,文件中显示图像。,Applet,应该做,HTML,做不到的事情,例如像幻灯机那样连续显示图像。,例11.3多幅图像的显示,如图11.3所示。,图11.3,import java.awt.*;,import java.awt.event.*;,import java.applet.*;,public class ShowImage2 extends Applet ,int index;,Image imgs=new Image6;,public void init(),addMouseListener(new MouseAdapter() ,public void mouseClicked(MouseEvent e) ,index=+index%6;,repaint();,);,for (int i=0; i6; i+),imgsi=getImage(getCodeBase(),duke+(i+1)+.gif);,public void paint(Graphics g),if (imgsindex!=null),g.drawImage(imgsindex,60,20,this);,public void paint(Graphics g),if (imgsindex!=null),g.drawImage(imgsindex,60,20,this);,11.1.4,生成图像,Java,有一个图像生成器,MemoryImageSource,类,可用它在内存中生成一幅图像。下面的例子可在,Applet,上显示了一个渐变底色。,图11.4,例11.4一个渐变图像的生成,如图11.4所示。,import java.awt.*;,import java.awt.image.*;,import java.applet.*;,public class show extends Applet ,Image img;,public void init() ,int w=256;/,图像的宽度设为256,int h=256;/,图像的高度设为256,int pix=new intw*h;,int index=0;,for (int red=0; redh; red+)/ red,从0变到255,for (int blue=0; bluew; blue+)/ blue,从0变到255,pixindex+=(25524) | (red16) | blue;,img=createImage(new MemoryImageSource(w, h, pix, 0, w);,public void paint(Graphics g) ,g.drawImage(img,0,0,this);,createImage,方法可以创建一个图像对象,它的参数是一个图像生成器,这个图像生成器由,MemoryImageSource,方法担任。该方法有5个参数:图像的宽度和高度、代表图像每一点颜色值的数组、画图像时的起始位置、扫描线的宽度。在,init,方法中,将这5个参数准备好后,生成了图像对象,最后在,paint,方法中将这个图像显示出来。,11.1.5 图形旋转与透明处理,在,Java AWT,中有一个增强图形类,Graphics2D,,提供了对图形、图像和文本的特殊处理,可实现缩放、旋转、透明等效果。下面的例子演示了图形的旋转与透明处理。,图11.5,例11.5图形的旋转与透明处理,如图11.5所示。,import java.awt.Color;,import java.awt.Graphics;,import java.awt.Graphics2D;,import java.awt.AlphaComposite;,public class Rotate extends java.applet.Applet ,public void paint(Graphics g) ,g.setColor(Color.red);,g.fillRect(100,30,100,100);,Graphics2D g2=(Graphics2D) g;/,将,g,强制转换为,Graphics2D,类型,int rule=AlphaComposite.SRC-OVER;/,指定颜色合成模式,float alpha=0.5f;/,指定颜色透明值,AlphaComposite ac=AlphaComposite.getInstance(rule, alpha);,g2.setComposite(ac);/,设定,g2,的颜色合成模式,g2.setColor(Color.blue);,g2.translate(150,10);/,转换,g2,的坐标系,平移到(150, 10),g2.rotate(45*Math.PI)/180);/,绘图区顺时针旋转45度,g2.fillRect(0,0,100,100);,根据这两个参数值,调用,AlphaComposite,的,getInstance,方法创建模式对象,ac,,然后根据,ac,调用,Graphics2D,的,setComposite,方法设定绘图区的颜色合成模式,此后将按照新模式画出图形。,Graphics2D,的,rotate,方法以弧度为单位将绘图区顺时针旋转一个指定角度,由于旋转后坐标系发生变化,所以要先调用,translate,方法把坐标系平移,使画出的图形保持在原坐标系的位置上。,11.2 动画处理,戏软件的设计中,动画向程序员提出了挑战,但在,Java,中实现动画则是十分简单的事情。,下面让我们一起由浅入深地编写几个动画程序实例,并通过对这些实例的逐步改进来探讨,Java,动画技术的关键。,11.2.1 动画原理,其实,计算机动画原理十分简单,首先在屏幕上显示出第一帧画面,过一会儿把它擦掉,然后再显示下一帧画面,如此循环往复。由于人眼存在着一个视觉差,所以感觉好像画面中的物体在不断运动。,图11.6,例11.6宇宙飞船游太空,如图11.6所示。,import java.awt.*;,import java.applet.*;,public class MovingImg extends Applet ,Image star, rocket;,int x=10;,public void init() ,star=getImage(getCodeBase(),starfield.gif);,rocket=getImage(getCodeBase(),rocket.gif);,public void paint(Graphics g) ,g.drawImage(star,0,0,this);,g.drawImage(rocket,x,15,this);,try ,Thread.sleep(50);,x+=5;,if (x=210) ,x=10;,Thread.sleep(1000);, catch (InterruptedException e) ,repaint();,这是一个很简单的动画,在,Applet,中有一个充当太空的背景图,一艘宇宙飞船在太空图上不断从左边移动到右边。,程序中创建了两个,Image,对象,star,和,rocket,,在,init,方法中分别加载了两个图像文件和这两个对象关联起来。添加了变量,x,用来指定飞船的画出位置,,x,初始化为10。在,paint,方法中,注意到太空总是画在指定位置(0, 0),而飞船则画在位置(,x, 15),,其中,x,的值是不断变化的。,真正使飞船实现动画效果是在,try.catch,块中。,paint,方法的最后一条语句是调用,repaint,方法。,repaint,方法的功能是重画图像,它先调用,update,方法将显示区清空,再调用,paint,方法画出图像。这就形成了一个循环,,paint,调用了,repaint,,而,repaint,又调用了,paint,,使飞船不间断地来回移动。,运行这个,Applet,时,画面有闪烁现象。一般来说,画面越大,,update,以背景色清除显示区所占用的时间就越长,不可避免地会产生闪烁。为了达到平滑而又没有闪烁的动画效果,就应该考虑采取一些补救措施。,覆盖,update,方法可以降低闪烁,但不能消除它。能有效消除闪烁的方法是采用图形双缓冲技术(,graphics double buffering)。,图11.7,11.2.2 图形双缓冲,例11.7改进后的宇宙飞船游太空,参见图11.6,import java.awt.*;,import java.applet.*;,public class MovingImg1 extends Applet ,Image star, rocket, buffer;,Graphics gContext;,int x=10;,public void init() ,star=getImage(getCodeBase(),starfield.gif);,rocket=getImage(getCodeBase(),rocket.gif);,buffer=createImage(getWidth(),getHeight();,gContext=buffer.getGraphics();,public void paint(Graphics g) ,gContext.drawImage(star,0,0,this);,gContext.drawImage(rocket,x,15,this);,g.drawImage(buffer,0,0,this);,try ,Thread.sleep(10);,x+=2;,if (x=210) ,x=10;,Thread.sleep(1000);,catch (InterruptedException e) ,repaint();,public void update(Graphics g) ,paint(g);,11.2.3 用线程实现动画,例11.7用图形双缓冲改善了图像闪烁问题,但仍存在一些其他问题。例如用户离开网页后,嵌入的,Applet,会继续运行,占用,CPU,时间。下面的例子出于网络实用的目的,采用独立线程实现动画。,import java.awt.*;,import java.applet.*;,public class Running extends Applet implements Runnable ,Image img=new Image10;,Image buffer;,Graphics gContext;,Thread animate;,int index=0;,public void init() ,buffer=createImage(getWidth(),getHeight();,gContext=buffer.getGraphics();,for (int i=0;i40),size=12;,public void paint(Graphics g) ,g.drawImage(buffer,0,0,this);,public void update(Graphics g) ,paint(g);,在,run,方法的永恒循环中,首先计算出字符串显示位置,x,和,y,,使字符串每一次都显示在,Applet,的中心。调用,gContext,的,setFont,方法指定字体为宋体、字体风格为,PLAIN、,字体大小为,size。,调用,gContext,的,drawString,方法在指定位置输出字符串。然后调用,repaint,方法进行屏幕拷贝。线程休眠50毫秒后,清除后台屏幕中的图像。最后,对字体大小,size,进行处理,每次增量后,如果,size,大于40就恢复到初始值12。,11.2.5,图像高级处理水中倒影,例11.10用一幅图像制作出它的水中倒影,并能显示水波纹,如图11.9所示。,图11.9,import java.awt.*;,import java.applet.*;,public class Lake extends Applet implements Runnable ,Thread animate;,Image img,buffer;,Graphics gContext;,int width,height;,public void init() ,img=getImage(getCodeBase(),tree.jpeg);,MediaTracker tracker=new MediaTracker(this);/,创建图像加载跟踪器,tracker.addImage(img,0);/,添加要跟踪的图像,代号为0,try ,tracker.waitForID(0);/,等待图像加载完毕,catch (InterruptedException e) ,width=img.getWidth(this);,height=img.getHeight(this)/2;/,仅使用图像的一半,buffer=createImage(2*width,height);/,创建后台屏幕,原始图像的两倍宽度,gContext=buffer.getGraphics();,gContext.drawImage(img,0,-height,this);/,图像的下半部分画到后台屏幕,for (int i=0;iheight;i+)/,将图像逐线拷贝,生成图像倒影,gContext.copyArea(0,i,width,1,width,(height-1)-2*i);/,拷贝到后台屏幕右半边,gContext.clearRect(0,0,width,height);/,清除后台屏幕左半边,public void start() ,if (animate=null) ,animate=new Thread(this);,animate.start();,public void stop() ,if (animate!=null),animate=null;,public void run() ,int dy,num=0;,double d;,while (true) ,d=num*Math.PI/6;/,生成一个角度,共有12个值,for (int i=0;iheight;i+) ,dy=(int)(i/12.0D+1)*Math.sin(height/12.0D*(height-i)/(i+1)+d);/,经验公式,gContext.copyArea(width,i+dy,width,1,-width,-dy);/,从右向左拷贝生成波纹,repaint();,num=+num%12;,try ,Thread.sleep(50);, catch (InterruptedException e) ,public void update(Graphics g) ,paint(g);,public void paint(Graphics g) ,g.drawImage(img,0,-height,this);/,显示图像的下半部分,g.drawImage(buffer,0,height,this);/,显示图像倒影,合成一幅完整图像,11.3 数字音频,11.3.1 加载声音文件,在,Applet,中播放声音十分简单,加载声音文件,然后调用,play,方法播放即可。,Java,提供了两种播放声音的方式:一种是通过,Applet,类的,play,方法,一种是通过,AudioClip,接口中的方法来播放。,Applet,的,play,方法可以将声音文件的加载与播放一并完成,其调用格式如下:,void play(URL url),void play(URL url, String name),其中,URL,是一个网络地址,网络地址若包含声音文件可采用第一种形式,否则采用第二种形式,播放本地计算机上的声音文件也可采用第二种形式。假设有一个,MIDI,声音文件,trip.mid,和,Applet,放在同一个目录下,采用如下调用格式即可播放:,play(getCodeBase( ),trip.mid);,Applet,的,getAudioClip,方法可创建这样的对象,该方法加载指定网络地址的声音文件,并返回一个,AudioClip,对象,调用格式如下:,AudioClip getAudioClip(URL url),AudioClip getAudioClip(URL url, String name),创建,AudioClip,对象后,声音文件即被加载,可调用它的方法处理声音文件。如果该方法没有找到指定的声音文件,将返回,null,值,此时不能引用所创建的对象。,AudioClip,只有3个方法:,void play(),播放一遍;,void loop(),连续播放;,void stop(),停止播放。,11.3.2 在,Applet,中播放声音,例11.11本地计算机工作目录下有5个声音文件,代表了5种声音格式,加载并播放这些声音文件。结果如图11.10所示。,图11.10,import java.awt.*;,import java.awt.event.*;,import java.applet.Applet;,import java.applet.AudioClip;,public class SoundPlay extends Applet implements ItemListener, ActionListener ,AudioClip sound;,Choice c=new Choice();,Button play=new Button(,播放);,Button loop=new Button(,连续);,Button stop=new Button(,停止);,public void init() ,c.add(space.au);,c.add(flute.aif);,c.add(trip.mid);,c.add(jungle.rmf);,c.add(bottle.wav);,add(c);,c.addItemListener(this);,add(play);,add(loop);,add(stop);,play.addActionListener(this);,loop.addActionListener(this);,stop.addActionListener(this);,sound=getAudioClip(getCodeBase(), space.au);,public void itemStateChanged(ItemEvent e) ,sound.stop();,sound=getAudioClip(getCodeBase(), c.getSelectedItem();,ublic void actionPerformed(ActionEvent e) ,if (e.getSource()=play) sound.play();,else if (e.getSource()=loop) sound.loop();,else if (e.getSource()=stop) sound.stop();,习 题,如何加载和显示一幅图像?如何放大和缩小一幅图像的显示?,如何生成一幅内存图像?如何消除画面切换时的闪烁?,何为图形双缓冲技术?编写动画程序时需要注意哪些因素?,如何加载和播放声音文件?,编写一个,Applet,,显示一幅图像并配上背景音乐。,编写一个,Applet,,动画显示一个数码钟,用数字显示时、分、秒。,习 题,7. 编写一个,Applet,,动画显示圆形时钟,显示时针和分针。,8. 编.写一个,Applet,,实现向上滚动显示一行文字。,9. 编.写一个,Applet,,实现向左滚动显示一行文字。,10. 编写一个,Applet,,实现向上滚动显示一幅图像。,11. 编写一个,Applet,,实现网页上的,banner,技术即连续显示多幅图像,每秒钟显示6幅图像。,12. 编写一个,Applet,,实现拉幕特效,即将一幅图像从中间向左右两边逐渐显示出来。,习 题,13. 编写一个,Applet,,实现一行文字蛇行移动。,14. 编写一个,Applet,,实现一个小球沿正弦曲线移动。,15. 编写一个,Applet,,实现一个小球沿抛物线移动,到达地面时播放一个响声。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 金融资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!