




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章多媒体编程,11.1图像处理11.2动画处理11.3数字音频习题,中国最庞大的数据库下载,11.1图像处理,Java支持两种图像格式JPEG和GIF。11.1.1图像种类1.BMPBMP是Windows的标准位图文件格式,含有固定数量的像素点颜色,可用Windows的画图程序打开。这种图像在放大时,会出现锯齿边缘,变得很不清晰。图像文件没有被压缩过,规模较大,不适合在Internet上使用,Java不能显示这种图像。,中国最庞大的数据库下载,2.JPEG或JPGJPEG称为联合图像专家组(jointphotographicexpertsgroup),可用浏览器打开。JPEG(或JPG)图像格式一般用来显示照片和具有连续色调的图像,它能保存图像所有颜色信息。JPEG是一种压缩的文件格式,在打开时自动解压缩。由于压缩后的文件规模较小,成为Internet上广泛使用的图像格式,Java可以显示这种图像。3.GIFGIF称为图像交换格式(graphicinterchangeformat),可用浏览器打开。GIF图像是一种压缩文件格式,由于它能最大限度地减少文件转换时间,所以在HTML文件中常用于显示插图或图标。GIF格式能有效减少文件大小,有利于在Internet上使用,Java支持这种图像格式。,图11.1,11.1.2图像的显示例11.1在Applet中显示一幅图像,如图11.1所示。,importjava.applet.Applet;importjava.awt.Image;importjava.awt.Graphics;publicclassShowImageextendsAppletImageimg;publicvoidinit()img=getImage(getCodeBase(),bld.jpg);publicvoidpaint(Graphicsg)g.drawImage(img,30,10,this);,1.加载图像加载图像一般放在初始化方法init中进行。程序中的getImage方法可加载Java支持的图像文件,它有两个参数,一个是图像文件地址,一个是图像文件名称。由于Applet是面向网络的,因此图像文件的存储位置并不局限于本地计算机的磁盘目录,大部分情况是直接读取Web服务器上的图像文件。getImage方法返回一个Image对象,它的调用格式为:ImagegetImage(URLurl)ImagegetImage(URLurl,Stringname)其中url是一个URL类的对象,代表一个网络地址(关于URL的概念请参考下一章的内容),例如下面的语句可以加载sun公司Web服务器指定位置上的一幅图片:,getImage(newURL(,其中img就是要显示的图像、x和y是图像显示位置(x和y可取负值,表示一部分图像被移出了显示区)、bgcolor是图像显示区域的背景色、observer是图像加载跟踪器,通常将该参数指定为this,即由Applet负责跟踪图像的加载情况。这两种方法都是将图像照原样显示,能不能对图像进行缩放呢?使用下面两种调用格式就可以对图像进行缩放显示:booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)booleandrawImage(Imageimg,intx,inty,intw,inth,Colorc,ImageObserverobserver),图11.2,例11.2图像的缩放显示,如图11.2所示。,importjava.awt.*;importjava.applet.*;publicclassShowImage1extendsAppletImageimg;publicvoidinit()img=getImage(getCodeBase(),ball.jpg);publicvoidpaint(Graphicsg)intw=img.getWidth(this);,inth=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,importjava.awt.*;importjava.awt.event.*;importjava.applet.*;publicclassShowImage2extendsAppletintindex;Imageimgs=newImage6;publicvoidinit()addMouseListener(newMouseAdapter(),publicvoidmouseClicked(MouseEvente)index=+index%6;repaint(););for(inti=0;i6;i+)imgsi=getImage(getCodeBase(),duke+(i+1)+.gif);publicvoidpaint(Graphicsg)if(imgsindex!=null)g.drawImage(imgsindex,60,20,this);,publicvoidpaint(Graphicsg)if(imgsindex!=null)g.drawImage(imgsindex,60,20,this);11.1.4生成图像Java有一个图像生成器MemoryImageSource类,可用它在内存中生成一幅图像。下面的例子可在Applet上显示了一个渐变底色。,图11.4,例11.4一个渐变图像的生成,如图11.4所示。,importjava.awt.*;importjava.awt.image.*;importjava.applet.*;publicclassshowextendsAppletImageimg;publicvoidinit()intw=256;/图像的宽度设为256inth=256;/图像的高度设为256intpix=newintw*h;intindex=0;,for(intred=0;redh;red+)/red从0变到255for(intblue=0;bluew;blue+)/blue从0变到255pixindex+=(25524)|(red16)|blue;img=createImage(newMemoryImageSource(w,h,pix,0,w);publicvoidpaint(Graphicsg)g.drawImage(img,0,0,this);,createImage方法可以创建一个图像对象,它的参数是一个图像生成器,这个图像生成器由MemoryImageSource方法担任。该方法有5个参数:图像的宽度和高度、代表图像每一点颜色值的数组、画图像时的起始位置、扫描线的宽度。在init方法中,将这5个参数准备好后,生成了图像对象,最后在paint方法中将这个图像显示出来。11.1.5图形旋转与透明处理在JavaAWT中有一个增强图形类Graphics2D,提供了对图形、图像和文本的特殊处理,可实现缩放、旋转、透明等效果。下面的例子演示了图形的旋转与透明处理。,图11.5,例11.5图形的旋转与透明处理,如图11.5所示。,importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.AlphaComposite;publicclassRotateextendsjava.applet.Appletpublicvoidpaint(Graphicsg)g.setColor(Color.red);g.fillRect(100,30,100,100);Graphics2Dg2=(Graphics2D)g;/将g强制转换为Graphics2D类型intrule=AlphaComposite.SRC-OVER;/指定颜色合成模式,floatalpha=0.5f;/指定颜色透明值AlphaCompositeac=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所示。,importjava.awt.*;importjava.applet.*;publicclassMovingImgextendsAppletImagestar,rocket;intx=10;publicvoidinit()star=getImage(getCodeBase(),starfield.gif);rocket=getImage(getCodeBase(),rocket.gif);,publicvoidpaint(Graphicsg)g.drawImage(star,0,0,this);g.drawImage(rocket,x,15,this);tryThread.sleep(50);x+=5;if(x=210)x=10;Thread.sleep(1000);,catch(InterruptedExceptione)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方法可以降低闪烁,但不能消除它。能有效消除闪烁的方法是采用图形双缓冲技术(graphicsdoublebuffering)。,图11.7,11.2.2图形双缓冲例11.7改进后的宇宙飞船游太空,参见图11.6,importjava.awt.*;importjava.applet.*;publicclassMovingImg1extendsAppletImagestar,rocket,buffer;GraphicsgContext;intx=10;publicvoidinit()star=getImage(getCodeBase(),starfield.gif);,rocket=getImage(getCodeBase(),rocket.gif);buffer=createImage(getWidth(),getHeight();gContext=buffer.getGraphics();publicvoidpaint(Graphicsg)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(InterruptedExceptione)repaint();,publicvoidupdate(Graphicsg)paint(g);11.2.3用线程实现动画例11.7用图形双缓冲改善了图像闪烁问题,但仍存在一些其他问题。例如用户离开网页后,嵌入的Applet会继续运行,占用CPU时间。下面的例子出于网络实用的目的,采用独立线程实现动画。,importjava.awt.*;importjava.applet.*;publicclassRunningextendsAppletimplementsRunnableImageimg=newImage10;Imagebuffer;GraphicsgContext;Threadanimate;intindex=0;,publicvoidinit()buffer=createImage(getWidth(),getHeight();gContext=buffer.getGraphics();for(inti=0;i40)size=12;,publicvoidpaint(Graphicsg)g.drawImage(buffer,0,0,this);publicvoidupdate(Graphicsg)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,importjava.awt.*;importjava.applet.*;publicclassLakeextendsAppletimplementsRunnableThreadanimate;Imageimg,buffer;GraphicsgContext;intwidth,height;publicvoidinit()img=getImage(getCodeBase(),tree.jpeg);,MediaTrackertracker=newMediaTracker(this);/创建图像加载跟踪器tracker.addImage(img,0);/添加要跟踪的图像,代号为0trytracker.waitForID(0);/等待图像加载完毕catch(InterruptedExceptione)width=img.getWidth(this);height=img.getHeight(this)/2;/仅使用图像的一半,buffer=createImage(2*width,height);/创建后台屏幕,原始图像的两倍宽度gContext=buffer.getGraphics();gContext.drawImage(img,0,-height,this);/图像的下半部分画到后台屏幕for(inti=0;iheight;i+)/将图像逐线拷贝,生成图像倒影gContext.copyArea(0,i,width,1,width,(height-1)-2*i);/拷贝到后台屏幕右半边,gContext.clearRect(0,0,width,height);/清除后台屏幕左半边publicvoidstart()if(animate=null)animate=newThread(this);animate.start();publicvoidstop()if(animate!=null),animate=null;publicvoidrun()intdy,num=0;doubled;while(true)d=num*Math.PI/6;/生成一个角度,共有12个值for(inti=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;tryThread.sleep(50);catch(InterruptedExceptione),publicvoidupdate(Graphicsg)paint(g);publicvoidpaint(Graphicsg)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方法可以将声音文件的加载与播放一并完成,其调用格式如下:voidplay(URLurl)voidplay(URLurl,Stringname),其中URL是一个网络地址,网络地址若包含声音文件可采用第一种形式,否则采用第二种形式,播放本地计算机上的声音文件也可采用第二种形式。假设有一个MIDI声音文件trip.mid和Applet放在同一个目录下,采用如下调用格式即可播放:play(getCodeBase(),trip.mid);Applet的getAudioClip方法可创建这样的对象,该方法加载指定网络地址的声音文件,并返回一个AudioClip对象,调用格式如下:AudioClipgetAudioClip(URLurl)AudioClipgetAudioClip(URLurl,Stringname),创建AudioClip对象后,声音文件即被加载,可调用它的方法处理声音文件。如果该方法没有找到指定的声音文件,将返回null值,此时不能引用所创建的对象。AudioClip只有3个方法:voidplay()播放一遍;voidloop()连续播放;voidstop()停止播放。11.3.2在Applet中播放声音例11.11本地计算机工作目录下有5个声音文件,代表了5种声音格式,加载并播放这些声音文件。结果如图11.10所示。,图11.10,importjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;importjava.applet.AudioClip;publicclassSoundPlayextendsAppletimplementsItemListener,ActionListenerAudioClipsound;Choicec=newChoice();Buttonplay=newButton(播放);Buttonloop=newButton(连续);Buttonstop=newButton(停止);,publicvoidinit()c.add(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消费者行为变化对鞋类设计的影响-洞察及研究
- 5G通信技术融合创新-洞察及研究
- 河南省重点中学2026届九年级英语第一学期期末学业水平测试试题含解析
- 辽宁省葫芦岛2026届英语九上期末联考试题含解析
- 2026届四川省阆中学市化学九年级第一学期期中调研试题含解析
- 2026届天津市红桥区铃铛阁中学化学九年级第一学期期末达标检测模拟试题含解析
- 2026届贵州省正安县化学九年级第一学期期中预测试题含解析
- 山西省长治市2026届英语九上期末监测模拟试题含解析
- 2025年免烧砖机项目规划申请报告范文
- 2025年商用衡器项目规划申请报告
- 2025年江西省高考生物试卷真题(含标准答案及解析)
- 2025年辅警笔试题库行测及答案指导
- 运维7×24小时服务保障方案
- 单招临床医学试题及答案2025年版
- 2025年辽宁省中考语文真题卷含答案解析
- 儿童抽动障碍的诊断与评估(2025年)解读课件
- 甘露醇治疗颅内压增高中国专家共识解读 4
- 美容院设备维护管理规章
- 2025年行政执法考试-公安民警中级执法资格考试历年参考题库含答案解析(5套典型考题)
- 【语文 北京版】2025年高考招生统一考试高考真题语文试卷(真题+答案)
- 大健康产业发展现状与趋势分析
评论
0/150
提交评论