您好,欢迎访问三七文档
第11章多媒体编程11.1图像处理11.2动画处理11.3数字音频习题图像处理•Java支持两种图像格式JPEG和GIF。11.1.1图像种类1.BMP•BMP是Windows的标准位图文件格式,含有固定数量的像素点颜色,可用Windows的画图程序打开。这种图像在放大时,会出现锯齿边缘,变得很不清晰。图像文件没有被压缩过,规模较大,不适合在Internet上使用,Java不能显示这种图像。•JPEG称为联合图像专家组(jointphotographicexpertsgroup),可用浏览器打开。JPEG(或JPG)图像格式一般用来显示照片和具有连续色调的图像,它能保存图像所有颜色信息。JPEG是一种压缩的文件格式,在打开时自动解压缩。由于压缩后的文件规模较小,成为Internet上广泛使用的图像格式,Java可以显示这种图像。3.GIF•GIF称为图像交换格式(graphicinterchangeformat),可用浏览器打开。GIF图像是一种压缩文件格式,由于它能最大限度地减少文件转换时间,所以在HTML文件中常用于显示插图或图标。GIF格式能有效减少文件大小,有利于在Internet上使用,Java支持这种图像格式。图11.111.1.2图像的显示•例11.1在Applet中显示一幅图像,如图11.1所示。importjava.applet.Applet;importjava.awt.Image;importjava.awt.Graphics;publicclassShowImageextendsApplet{Imageimg;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(″″));2.显示图像•显示图像需要调用Graphics类的方法drawImage,它可以将Image对象关联的图像显示在Applet的指定位置。drawImage方法的调用格式如下:booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)booleandrawImage(Imageimg,intx,inty,Colorbgcolor,ImageObserverobserver)•其中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.*;publicclassShowImage1extendsApplet{Imageimg;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.3importjava.awt.*;importjava.awt.event.*;importjava.applet.*;publicclassShowImage2extendsApplet{intindex;Imageimgs[]=newImage[6];publicvoidinit(){addMouseListener(newMouseAdapter(){publicvoidmouseClicked(MouseEvente){index=++index%6;repaint();}});for(inti=0;i6;i++)imgs[i]=getImage(getCodeBase(),″duke″+(i+1)+″.gif″);}publicvoidpaint(Graphicsg){if(imgs[index]!=null)g.drawImage(imgs[index],60,20,this);}publicvoidpaint(Graphicsg){if(imgs[index]!=null)g.drawImage(imgs[index],60,20,this);}}11.1.4生成图像•Java有一个图像生成器MemoryImageSource类,可用它在内存中生成一幅图像。下面的例子可在Applet上显示了一个渐变底色。图11.4•例11.4一个渐变图像的生成,如图11.4所示。importjava.awt.*;importjava.awt.image.*;importjava.applet.*;publicclassshowextendsApplet{Imageimg;publicvoidinit(){intw=256;//图像的宽度设为256inth=256;//图像的高度设为256int[]pix=newint[w*h];intindex=0;for(intred=0;redh;red++)//red从0变到255for(intblue=0;bluew;blue++)//blue从0变到255pix[index++]=(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.Applet{publicvoidpaint(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.*;publicclassMovingImgextendsApplet{Imagestar,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);try{Thread.sleep(50);x+=5;if(x==210){x=10;Thread.sleep(1000);}}catch(InterruptedExceptione){}re
本文标题:多媒体编程(1)
链接地址:https://www.777doc.com/doc-1474020 .html