国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

圖像與聲音

2019-11-18 15:18:25
字體:
供稿:網(wǎng)友

  圖像與聲音

與其它語言相比較,假如說java對圖形和文本媒體的支持并不占明顯優(yōu)勢的話,那么Java對圖像與聲音媒體的支持真可謂是技高一籌,顯示圖像與播放聲音就如同顯示一行文本一樣方便。同時(shí),正由于在Java動(dòng)畫中靈活的運(yùn)用圖像和聲音媒體,才使得Web頁面更具魅力。

正如上一節(jié)所介紹的,Graphics類中確實(shí)提供了不少繪制圖形的方法,但假如用它們在applet運(yùn)行過程中實(shí)時(shí)地繪制一幅較復(fù)雜的圖形(例如一條活潑可愛的小狗),就好比是在用斧頭和木塊去制造航天飛機(jī)。因此,對于復(fù)雜圖形,大部分都事先用專用的繪圖軟件繪制好,或者是用其它截取圖像的工具(如掃描儀、視效卡等)獲取圖像的數(shù)據(jù)信息,再將它們按一定的格式存入圖像文件。applet運(yùn)行時(shí),只要找到圖像文件存貯的位置,將它裝載到內(nèi)存里,然后在適當(dāng)?shù)臅r(shí)機(jī)將它顯示在屏幕上就可以了。

1. 圖像文件的裝載

Java目前所支持的圖像文件格式只有兩種,它們分別是GIF和JPEG格式(帶有.GIF、.JPG、.JPEG后綴名的文件)。因此若是其它格式的圖像文件,就先要將它們轉(zhuǎn)換為這兩種格式。能轉(zhuǎn)換圖像格式的軟件有很多,如PhotoStyler等。

Applet類中提供了getImage( )方法用來將預(yù)備好的圖像文件裝載到applet中,但我們必須首先指明圖像文件所存貯的位置。由于Java語言是面向網(wǎng)絡(luò)應(yīng)用的,因此文件的存貯位置并不局限于本地機(jī)器的磁盤目錄,而大部分情況是直接存取網(wǎng)絡(luò)中Web服務(wù)器上的圖像文件,因而,Java采用URL(Universal Resource Location,統(tǒng)一資源定位器)來定位圖像文件的網(wǎng)絡(luò)位置。因此,Java專門提供了URL類來治理URL信息(關(guān)于該類的具體介紹見下一章)。

表示一個(gè)URL信息可分為兩種形式:

一種稱為絕對URL形式,它指明了網(wǎng)絡(luò)資源的全路徑名。如:

絕對URL:“http://www.xyz.com/java/imgsample/images/m1.gif”

另一種稱為相對URL形式,分別由基準(zhǔn)URL(即base URL)再加上相對于基準(zhǔn)URL下的相對URL這兩部分組成,例如上面的例子可表示為:

基準(zhǔn)URL:“http://www.xyz.com/java/imgsample/”

相對URL:“images/m1.gif”

現(xiàn)在,我們可以來看一下getImage( )方法的調(diào)用格式了:

Image getImage(URL url)

Image getImage(URL url, String name)

我們可以發(fā)現(xiàn),這兩種調(diào)用格式的返回值都是Image對象。確實(shí),Java非凡提供了java.awt.Image類來治理與圖像文件有關(guān)的信息,因此執(zhí)行與圖像文件有關(guān)的操作時(shí)不要忘了import這個(gè)類。getImage( )方法的第一種調(diào)用格式只需一個(gè)URL對象作為參數(shù),這便是絕對URL。而后一種格式則帶有兩個(gè)參數(shù),第一個(gè)參數(shù)給出的URL對象是基準(zhǔn)URL,第二個(gè)參數(shù)是字符串類型,它描述了相對于基準(zhǔn)URL下的路徑和文件名信息,因此這兩個(gè)參數(shù)的內(nèi)容綜合在一起就構(gòu)成了一個(gè)絕對URL。例如,下面兩種寫法所返回的結(jié)果是一樣的:

Image img=getImage(new URL("http://www.xyz.com/java/imgsample/images/m1.gif");

Image img=getImage(new URL("http://www.xyz.com/java/imgsample/"),"images/m1.gif");

表面看來,好象第一種調(diào)用格式較方便一些,但實(shí)際上第二種調(diào)用格式用得更普遍,因?yàn)檫@種格式更具靈活性。原來,Applet類中提供了兩個(gè)方法來幫助我們方便地獲取基準(zhǔn)URL對象,它們的調(diào)用格式如下:

URL getDocumentBase( )

URL getCodeBase( )

其中g(shù)etDocumentBase( )方法返回的基準(zhǔn)URL對象代表了包含該applet的Html文件所處的目錄,例如該文件存貯在"http://www.xyz.com/java/imgsample/m1.html"中,則該方法就返回"http://www.xyz.com/java/imgsample/"路徑。而getCodeBase( )方法返回的基準(zhǔn)URL對象代表了該applet文件(.class文件)所處的目錄。它是根據(jù)HTML文件的"APPLET"標(biāo)記中的CODEBASE屬性值計(jì)算出來的,若該屬性沒有設(shè)置,則同樣返回該HTML文件所處的目錄。

好了,現(xiàn)在我們應(yīng)該可以感受到基準(zhǔn)URL的靈活性了吧。只要我們寫下語句:

Image img = getImage(getDocumentBase( ),"images/m1.gif");

那么即使整個(gè)imgsample目錄移到別處任何地方,也可以正確裝載圖像文件,而采用對于絕對URL形式則需要重新修改applet代碼并重新編譯。

2. 圖像文件的顯示

getImage( )方法僅僅是將圖像文件從網(wǎng)絡(luò)上裝載進(jìn)來,交由Image對象治理。那我們怎樣把得到的Image對象中的圖像顯示在屏幕上呢?這又要回到我們的老朋友Graphics類中來了,因?yàn)镚raphics類提供了一個(gè)drawImage( )方法,它能完成將Image對象中的圖像顯示在屏幕的特定位置上,就象顯示文本一樣方便。drawImage( )方法的調(diào)用格式如下:

boolean drawImage(Image img, int x, int y, ImageObserver observer)

其中img參數(shù)就是要顯示的Image對象。x和y參數(shù)是該圖像左上角的坐標(biāo)值。observer參數(shù)則是一個(gè)ImageObserver接口(interface),它用來跟蹤圖像文件裝載是否已經(jīng)完成的情況,通常我們都將該參數(shù)置為this,即傳遞本對象的引用去實(shí)現(xiàn)這個(gè)接口。

除了將圖像文件照原樣輸出以外,drawImage( )方法的另外一種調(diào)用格式還能指定圖像顯示的區(qū)域大小:

boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)

這種格式比第一種格式多了兩個(gè)參數(shù)width和height,即表示圖像顯示的寬度和高度。若實(shí)際圖像的寬度和高度與這兩個(gè)參數(shù)值不一樣時(shí),Java系統(tǒng)會(huì)自動(dòng)將它進(jìn)行縮放,以適合我們所定的矩形區(qū)域。

有時(shí),我們?yōu)榱瞬皇箞D像因縮放而變形失真,可以將原圖的寬和高均按相同的比例進(jìn)行縮小或放大。那么怎樣知道原圖的大小呢?只需調(diào)用Image類中的兩個(gè)方法就可以分別得到原圖的寬度和高度。它們的調(diào)用格式如下:

int getWidth(ImageObserver observer)

int getHeight(ImageObserver observer)

同drawImage( )方法一樣,我們通常用this作為observer的參數(shù)值。

下面的程序段給出了一個(gè)顯示圖像文件的例子,其顯示結(jié)果如圖4-14所示。

import java.awt.Graphics;

import java.awt.Image;

public class Images extends java.applet.Applet{

Image img;

public void init(){

img=getImage(getCodeBase(),"man.gif");

}

public void paint(Graphics g){

int w=img.getWidth(this);

int h=img.getHeight(this);

g.drawImage(img,20,10,this); //原圖

g.drawImage(img,200,10,w/2,h/2,this); //縮小一半

g.drawImage(img,20,200,w*2,h/3,this); //寬扁圖

g.drawImage(img,350,10,w/2,h*2,this); //瘦高圖

}

}

4.2.2 聲音文件的播放

對聲音媒體的直接支持可以說是Java的一大特色,尤其是在動(dòng)畫中配上聲音效果,就可以使人在視覺上和聽覺上均得到美的享受,那才叫過癮。Java中播放聲音文件與顯示圖像文件一樣方便,同樣只需要先將聲音文件裝載進(jìn)來,然后播放就行了。

Java目前支持的聲音文件只有一種格式,那就是SUN公司的AU格式(.AU文件),也稱為u-law格式。由于AU格式的聲音僅有8KHz的采樣頻率且不支持立體聲效果,所以音質(zhì)不算太好。唯一的好處就是AU聲音文件的尺寸比其它格式小,有利于網(wǎng)上傳輸。一般,我們較熟悉的大都是WAV格式的聲音文件,因此必須先將它們轉(zhuǎn)換為AU格式(可以選用Goldwave軟件來進(jìn)行這種格式轉(zhuǎn)換)。

聲音文件預(yù)備好以后,就可以考慮將它裝載進(jìn)來并播放。在Applet類中提供的play( )方法可以將聲音文件的裝載與播放一并完成,其調(diào)用格式如下:

void play(URL url)

void play(URL url, String name)

可見,play( )方法的調(diào)用格式與getImage( )方法是完全一樣的,也采用URL來定位聲音文件。例如,某聲音文件audio.au與applet文件存放在同一目錄下,可以這樣寫:
play(getCodeBase( ),"audio.au");

一旦play( )方法裝載了該聲音文件,就立即播放。假如找不到指定URL下的聲音文件,play( )方法不返回出錯(cuò)信息,只是聽不到想聽的聲音而已。由于play( )方法只能將聲音播放一遍,若想循環(huán)播放某聲音作為背景音樂,就需要用到功能更強(qiáng)大的AudioClip類,它能更有效地治理聲音的播放操作。因?yàn)樗欢x在java.applet程序包中,所以使用該類的話,不要忘了在程序頭部加上:

import java.applet.AudioClip;

為了得到AudioClip對象,我們可以調(diào)用Applet類中的getAudioClip( )方法。它能裝載指定URL的聲音文件,并返回一個(gè)AudioClip對象,其調(diào)用格式如下:

AudioClip getAudioClip(URL url)

AudioClip getAudioClip(URL url, String name)

得到AudioClip對象以后,就可以調(diào)用AudioClip類中所提供的各種方法來操作其中的聲音數(shù)據(jù),這些方法如表4-4所示。假如getAudioClip( )方法沒有找到所指定的聲音文件,就會(huì)返回null值。所以,在調(diào)用表4-4中所列的方法前,應(yīng)該先檢查一下得到的AudioClip對象不是null,因?yàn)樵趎ull對象上調(diào)用上述方法將導(dǎo)致出錯(cuò)。假如需要的話,我們還可以在applet中同時(shí)裝載幾個(gè)聲音文件來一起播放,到時(shí)候,這些聲音將混合在一起,就象二重奏一樣。另外還有一點(diǎn)要說明的是,假如我們使用AudioClip對象的loop( )方法來重復(fù)播放背景音樂時(shí),千萬不要忘記在適當(dāng)?shù)臅r(shí)候調(diào)用AudioClip對象的stop( )方法來結(jié)束放音,否則的話,即使用戶離開這一Web頁面,該聲音也不會(huì)停止,這無疑將會(huì)惹惱用戶。因此,一般我們都在applet的stop( )方法中添上停止播放的代碼。

例如,下面這段程序?qū)⒉シ艃啥温曇簦欢问沁B續(xù)播放的背景音樂,另一段是講話錄音。

import java.applet.AudioClip;

public class Audios extends java.applet.Applet{

AudioClip bgmusic,speak;

public void init(){

bgmusic=getAudioClip(getDocumentBase(),"space.au");

speak=getAudioClip(getDocumentBase(),"intro.au");

}

public void start(){

if(bgmusic!=null)

bgmusic.loop();

if(speak!=null)

speak.play();

}

public void stop(){

if(bgmusic!=null)

bgmusic.stop(); //關(guān)閉背景音樂,切記。

}

}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 余姚市| 如东县| 涿州市| 宣汉县| 喜德县| 格尔木市| 绥德县| 文昌市| 集安市| 定日县| 长岛县| 沿河| 普格县| 陆丰市| 闻喜县| 漯河市| 南投县| 嵩明县| 台南县| 宜宾县| 松江区| 石城县| 肃南| 乌兰察布市| 中西区| 南和县| 梁河县| 阿尔山市| 黑河市| 大兴区| 阿巴嘎旗| 临江市| 通河县| 新安县| 清丰县| 林口县| 页游| 宁津县| 米林县| 铜川市| 镇宁|