




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章 java在多媒體中的應(yīng)用 第第9章章 java在多媒體中的應(yīng)用在多媒體中的應(yīng)用 9.1 利用利用awt繪圖繪圖 9.2 graphics類的使用類的使用 9.3 font類的使用類的使用 9.4 圖像處理圖像處理 9.5 動(dòng)畫圖像處理動(dòng)畫圖像處理 第9章 java在多媒體中的應(yīng)用 9.1 利用利用awt繪圖繪圖 這一節(jié)中我們主要介紹如何使用java語(yǔ)言提供的 awt包繪圖。java.awt包中提供了用于繪圖的api,我 們通常稱之為2d api。不要以為只有設(shè)計(jì)繪圖程序或 游戲軟件才會(huì)用到j(luò)ava 2d,其實(shí)java 2d的用途可能遠(yuǎn) 比你想象的更廣泛。 第9章 java在多媒體中的應(yīng)
2、用 其實(shí),只要你的程序有g(shù)ui,就很可能會(huì)用到j(luò)ava 2d。 因?yàn)閍wt和swing的組件常常無法完全適合我們,這個(gè) 時(shí)候自己繪制一部分的gui就有絕對(duì)的必要。甚至, 我們還可以用java 2d來繪制自己的組件。實(shí)際上, awt和swing組件都是透過java 2d來進(jìn)行繪制的。 第9章 java在多媒體中的應(yīng)用 java 2d api增強(qiáng)了awt的圖形、文本和圖像功能, 可以開發(fā)更為強(qiáng)大的用戶接口和新型的java應(yīng)用程序。 除了更為強(qiáng)大的圖形、字體和圖像api外,java 2d api 還改進(jìn)了顏色的定義與復(fù)合及對(duì)任意幾何形狀和文本 的選中檢測(cè),并為打印機(jī)和顯示設(shè)備提供了統(tǒng)一的繪 制模式。
3、java 2d api還可以創(chuàng)建高級(jí)圖形庫(kù),并可創(chuàng) 建圖像和圖形文件讀/寫過濾器。當(dāng)與java媒體框架 (jmf) 和其他java媒體應(yīng)用程序配合使用時(shí),java 2d api還可用來創(chuàng)建和顯示動(dòng)畫和其他多媒體演示稿。 第9章 java在多媒體中的應(yīng)用 到底java 2d api有多強(qiáng)大?這一點(diǎn)我們可以通過 sun jdk包中提供的例程來了解。在命令行窗口下輸 入: c:cd jdk1.2demojfcjava2d c:jdk1.2demojfcjava2djava -classpath java2demo.jar java2demo 或 c:jdk1.2demojfcjava2dapplet
4、viewer java2demo.html 看到了嗎?java 2d神奇的威力! 第9章 java在多媒體中的應(yīng)用 下面我們來學(xué)習(xí)如何使用java 2d繪圖。上面看到 的例子雖然功能十分強(qiáng)大,但是它的實(shí)現(xiàn)非常復(fù)雜。 下面,我們先從簡(jiǎn)單一點(diǎn)的入手。 從java.awt.component類(所有窗口對(duì)象的基類)繼 承的類提供了一個(gè)名為paint()的方法,在需要重新繪制 組件時(shí),可調(diào)用該方法。 paint()方法只有一個(gè)參數(shù),該參數(shù)是graphics類的 實(shí)例。如果在某個(gè)繼承了component的類中覆蓋了該方 法,那么就可以使用該方法來控制在控制區(qū)域著何種 顏色。例如,下面的類創(chuàng)建了一個(gè)帶有藍(lán)
5、背景的面板。 第9章 java在多媒體中的應(yīng)用 例9.1 bluepanel.java import java.awt.*; class bluepanel extends panel public static void main(string args) frame f = new frame(); bluepanel p = new bluepanel(); f.add(p); f.setsize(300,100); f.setvisible(true); 第9章 java在多媒體中的應(yīng)用 / invoked when the panel needs to be repainted pu
6、blic void paint(graphics g) / get the rectangle that represents the viewable area / of the panel rectangle rect = g.getclipbounds(); / set the context to paint in a pre-defined color g.setcolor(color.blue); / fill the rectangle with the current color g.fillrect(rect.x, rect.y, rect.width, rect.heigh
7、t); 程序運(yùn)行結(jié)果如圖9.1所示。 第9章 java在多媒體中的應(yīng)用 圖 9.1 第9章 java在多媒體中的應(yīng)用 9.2 graphics類的使用類的使用 java.awt中提供了一系列的類用于繪制圖形。其中, color類包含了編輯顏色的方法和常量;font類包含了 編輯字體的方法和常量;fontmetrics類包含了獲取字 體信息的方法;polygon類包含了創(chuàng)建多邊形的方法; toolkit類提供了從系統(tǒng)獲得圖形信息的方法,例如可 顯示的字體集和屏幕分辨率等等;graphics類包含了繪 制字符串、線條以及各種幾何圖形的方法。 第9章 java在多媒體中的應(yīng)用 graphics是一個(gè)
8、抽象類,其作用是定義一個(gè)真正的 工具,用來接受圖形操作。在該類中,有47個(gè)公用方 法,可以用作顯示圖像和文本、繪制和填充形狀、剪 貼圖像操作等等。 9.2.1 繪制字符串、字符和字節(jié) 用于繪制字符串、字符和字節(jié)的方法分別為 public abstract void drawstring(string string, int x, int y)在坐標(biāo)(x,y)處以當(dāng)前字體和顏色繪制指定的字符串 string。 第9章 java在多媒體中的應(yīng)用 public void drawchars(char chars, int offset, int number, int x, int y) 在坐標(biāo)(x
9、,y)處以當(dāng)前字體和顏色繪制指定的一系 列字符。chars為要繪制的字符組,offset為位置的坐標(biāo), number為要繪制的元素個(gè)數(shù)。 public void drawbytes(byte bytes, int offset, int number, int x, int y) 在坐標(biāo)(x,y)處以當(dāng)前字體和顏色繪制指定的一系 列字節(jié)。bytes為要繪制的字節(jié)數(shù)組,offset為位置的坐 標(biāo),number為要繪制的元素個(gè)數(shù)。 第9章 java在多媒體中的應(yīng)用 下面的例子展示了如何使用了drawstring(), drawchars()和drawbytes()三個(gè)方法: 例9.2 drawsc
10、b.java import java.awt.*; public class drawscb extends frame string s = using drawstring!; char c = c, h, a, r, s, , 8; byte b = b, y, t, e, 1, 2, 3; 第9章 java在多媒體中的應(yīng)用 public static void main(string args) drawscb frame = new drawscb(); frame.setsize(300, 100); frame.setvisible(true); public void pain
11、t(graphics g) g.drawstring(s, 100, 40); g.drawchars(c, 0, 7, 100, 65); g.drawbytes(b, 0, 5, 100, 90); 程序運(yùn)行結(jié)果如圖9.2所示。 第9章 java在多媒體中的應(yīng)用 圖 9.2 第9章 java在多媒體中的應(yīng)用 9.2.2 顏色控制 color類定義了顏色常量和方法。每種顏色都是從 rgb(紅/綠/藍(lán))值創(chuàng)建出來的。一個(gè)rgb值有三部分, 都是從0255的整數(shù)值,分別代表著三種顏色的含量。 因此,實(shí)際上我們可以使用256256256種顏色,即 224種顏色。這就是我們常說的24位真彩色。但不是
12、任 何計(jì)算機(jī)都可以顯示所有的顏色,就目前來說,大部 分計(jì)算機(jī)都可以顯示24位甚至超過24位的彩色。顯然, 我們很難記住一種顏色的rgb值,因而,color類將一 些最常用的顏色預(yù)定義為常量以方便我們使用。表9.1 列出了預(yù)定義的顏色常量。 第9章 java在多媒體中的應(yīng)用 表9.1 color類中定義的顏色常量 顏色常量顏色rgb值 public final static color orange橙色255,200,0 public final static color pink粉紅色 255,175, 175 public final static color cyan青色0,255,255
13、 public final static color magenta火紅色255,0,255 public final static color yellow黃色255,255,0 public final static color black黑色0,0,0 public final static color white白色 255,255, 255 第9章 java在多媒體中的應(yīng)用 public final static color gray灰色 128,128,128 public final static color lightgray淺灰色 192,192,192 public fin
14、al static color darkgray深灰色 64,64,64 public final static color red紅色 255,0,0 public final static color green綠色 0,255,0 public final static color blue藍(lán)色 0,0,255 第9章 java在多媒體中的應(yīng)用 color類中常用的一些方法如下: public color(int r, int g, int b):創(chuàng)建指定rgb值的顏色。 public int getred():返回紅色含量的值。 public int getblue():返回藍(lán)色含量的
15、值。 public int getgreen():返回綠色含量的值。 graphics類與color類相關(guān)的常用方法有: public abstact color getcolor():返回圖形上下文的當(dāng) 前顏色。 public abstract void setcolor(color c):設(shè)置圖形上下文 的當(dāng)前顏色。 第9章 java在多媒體中的應(yīng)用 下面來看一個(gè)顏色控制的實(shí)例。 例9.3 showcolor.java import java.awt.*; public class showcolor extends frame int red, green, blue; public s
16、tatic void main(string args) showcolor frame = new showcolor(); frame.setsize(300, 100); frame.setvisible(true); public showcolor() 第9章 java在多媒體中的應(yīng)用 red = 200; green = 100; blue = 0; public void paint(graphics g) g.setcolor(new color(red, green, blue); g.drawstring(draw color string., 50, 40); color
17、 color = g.getcolor(); 第9章 java在多媒體中的應(yīng)用 g.drawstring(red:+color.getred(), 10, 70); g.drawstring(green:+color.getgreen(), 100, 70); g.drawstring(blue:+color.getblue(), 200, 70); 程序運(yùn)行結(jié)果如圖9.3所示。 第9章 java在多媒體中的應(yīng)用 圖 9.3 第9章 java在多媒體中的應(yīng)用 9.2.3 繪制幾何圖形 graphics類中用于繪制幾何圖形的方法如下: public abstract void drawline(
18、int x1, int y1, int x2, int y2) 在點(diǎn)(x1,y1)和(x2,y2)之間用當(dāng)前顏色繪制線段。 public void drawrect(int x, int y, int width, int height) 以點(diǎn)(x,y)為左上角坐標(biāo),width和height為寬度和 高度,用當(dāng)前顏色畫矩形。 public abstact void fillrect(int x, int y, int width, int height) 第9章 java在多媒體中的應(yīng)用 以點(diǎn)(x,y)為左上角坐標(biāo),width和height為寬度和 高度,用當(dāng)前顏色畫一個(gè)實(shí)心的矩形。 publ
19、ic abstact void clearrect(int x, int y, int width, int height) 以點(diǎn)(x,y)為左上角坐標(biāo),width和height為寬度和高 度,用當(dāng)前背景顏色畫一個(gè)實(shí)心的矩形。此方法用于 清除某個(gè)矩形顯示區(qū)域。 public abstact void drawroundrect(int x, int y, int width, int height, int arcwidth, int archeight) 以點(diǎn)(x,y)為左上角坐標(biāo),width和height為寬度和高 度,用當(dāng)前顏色畫圓角矩形。 第9章 java在多媒體中的應(yīng)用 public
20、 abstact void fillroundrect(int x, int y, int width, int height, int arcwidth, int archeight) 以點(diǎn)(x,y)為左上角坐標(biāo),width和height為寬度和高 度,用當(dāng)前顏色畫一個(gè)實(shí)心的圓角矩形。 public void draw3drect(int x, int y, int width, int height, boolean b) 用指定的width和height,以當(dāng)前顏色畫一個(gè)三維矩 形。矩形的左上角坐標(biāo)為(x,y)。當(dāng)b為true時(shí),矩形為 凸的;b為false時(shí),矩形為凹的。 第9章 ja
21、va在多媒體中的應(yīng)用 public void fill3drect(int x, int y, int width, int height, boolean b) 用指定的width和height,以當(dāng)前顏色畫一個(gè)填充的三 維矩形。矩形的左上角坐標(biāo)為(x,y)。當(dāng)b為true時(shí),矩形 為凸的;b為false時(shí),矩形為凹的。 public abstract void drawoval(int x, int y, int width, int height) 用指定的width和height,以當(dāng)前顏色畫橢圓。外切矩 形的左上角坐標(biāo)為(x,y)。 public abstract void fill
22、oval(int x, int y, int width, int height) 用指定的width和height,以當(dāng)前顏色畫實(shí)心橢圓。外 切矩形的左上角坐標(biāo)為(x,y)。 第9章 java在多媒體中的應(yīng)用 public abstract void drawarc(int x, int y, int width, int height, int startangle, int arcangle) 參考外切矩形的左上角坐標(biāo)(x,y),用指定的width 和height,以當(dāng)前顏色繪制一段弧?;《螐钠鹗冀?startangle開始一直到張角arcangle。 public abstract v
23、oid fillarc(int x, int y, int width, int height, int startangle, int arcangle) 參考外切矩形的左上角坐標(biāo)(x,y),用指定的width 和height,以當(dāng)前顏色繪制一段實(shí)心的弧?;《螐钠鹗?角startangle開始一直到張角arcangle。 第9章 java在多媒體中的應(yīng)用 public abstract void drawpolygon(int xpoints, int ypoints, int points) 以當(dāng)前顏色畫一個(gè)具有points個(gè)頂點(diǎn)的多邊形。 xpoint和ypoint數(shù)組分別指定了每個(gè)頂點(diǎn)
24、的x和y坐標(biāo)。 public void drawpolygon(polygon p) 以當(dāng)前顏色畫指定的多邊形。 第9章 java在多媒體中的應(yīng)用 public abstract void fillpolygon(int xpoints, int, ypoints, int points) 以當(dāng)前顏色畫一個(gè)具有points個(gè)頂點(diǎn)的填充多邊形。 xpoint和ypoint數(shù)組分別指定了每個(gè)頂點(diǎn)的x和y坐標(biāo)。 下面我們通過一個(gè)例子來學(xué)習(xí)這些方法。 第9章 java在多媒體中的應(yīng)用 例9.4 drawdemo.java import java.awt.*; public class drawdemo
25、 extends frame public static void main(string args) drawdemo frame = new drawdemo(); frame.setsize(400, 500); frame.setvisible(true); public void paint(graphics g) 第9章 java在多媒體中的應(yīng)用 / draw a line g.drawline(10, 30, 200, 40); / draw a rectangle g.drawrect(10, 50, 100, 50); / draw a filled rectangle g.
26、fillrect(150, 50, 100, 50); / draw a rounded rectangle g.drawroundrect(10, 120, 50, 50, 10, 20); / draw a filled rounded rectangle g.fillroundrect(80, 120, 50, 50, 40, 20); / draw a ellipse 第9章 java在多媒體中的應(yīng)用 g.drawroundrect(150, 130, 80, 20, 70, 70); / draw a filled square g.drawroundrect(250, 120, 5
27、0, 50, 0, 0); / draw a circle g.drawroundrect(330, 120, 50, 50, 50, 50); g.setcolor(color.yellow); / draw a raised 3d rectangle g.draw3drect(10, 190, 50, 50, true); / draw a sunk 3d rectangle g.draw3drect(100, 190, 50, 50, false); 第9章 java在多媒體中的應(yīng)用 / draw a filled raised 3d rectangle g.fill3drect(200
28、, 190, 50, 50, true); / draw a filled sunk 3d rectangle g.fill3drect(300, 190, 50, 50, false); g.setcolor(color.black); / draw an oval g.drawoval(10, 260, 70, 50); / draw an filled oval g.filloval(200, 260, 50, 70); / draw an arc g.drawarc(10, 350, 60, 60, 0, 180); 第9章 java在多媒體中的應(yīng)用 / draw solid arc
29、g.fillarc(100, 350, 50, 60, 0, 270); g.fillarc(200, 350, 50, 60, 0, -110); g.fillarc(300, 350, 40, 60, 0, -360); / draw a polygon int xpoints1 = 10, 30, 40, 20, 10, 5, 10; int ypoints1 = 430, 430, 440, 460, 460, 440, 430; g.drawpolygon(xpoints1, ypoints1, 7); 第9章 java在多媒體中的應(yīng)用 / draw a filled polygon
30、 int xpoints2 = 100, 120, 130, 110, 100, 95, 90, 100; int ypoints2 = 430, 430, 440, 460, 460, 440, 420, 430; g.fillpolygon(xpoints2, ypoints2, 8); 程序運(yùn)行結(jié)果如圖9.4所示。 第9章 java在多媒體中的應(yīng)用 圖 9.4 第9章 java在多媒體中的應(yīng)用 9.2.4 屏幕操作 本節(jié)介紹一種實(shí)現(xiàn)屏幕操作的graphics方法 copyarea()。copyarea()方法用于復(fù)制屏幕的一個(gè)區(qū)域, 并將它放置在屏幕的另一個(gè)位置上。copyarea方法的
31、 定義如下:public abstract void copyarea(int x, int y, int width, int height, int dx, int dy)其中,參數(shù)x和y指定了復(fù) 制區(qū)域的左上角坐標(biāo);width和height為區(qū)域的寬和高; dx和dy指定了與點(diǎn)(x,y)的水平和垂直偏移量,復(fù)制的 區(qū)域放置在該偏移量相對(duì)于(x,y)的位置上。 第9章 java在多媒體中的應(yīng)用 例9.5 copyareademo.java import java.awt.*; public class copyareademo extends frame public static voi
32、d main(string args) copyareademo frame = new copyareademo(); frame.setsize(300, 200); frame.setvisible(true); public void paint(graphics g) 第9章 java在多媒體中的應(yīng)用 g.drawrect(20, 30, 50, 50); g.filloval(50, 100, 50, 70); g.copyarea(20, 30, 100, 170, 150, 20); 程序運(yùn)行結(jié)果如圖9.5所示。 第9章 java在多媒體中的應(yīng)用 圖 9.5 第9章 java在
33、多媒體中的應(yīng)用 9.2.5 繪圖模式 繪圖模式(paint mode)用于描述如何繪圖。默認(rèn)的 繪圖模式是覆蓋模式(overwrite),當(dāng)一個(gè)圖形畫在另一 個(gè)圖形上面時(shí),舊的圖形將被覆蓋,看到的將只是新 的圖形。另外,還有一種異或繪圖模式(xor),使用 這種模式可以看到互相重疊的所有圖形。使用異或繪 圖模式可以通過調(diào)用graphics的方法: public abstract void setxormode(color c) 第9章 java在多媒體中的應(yīng)用 來實(shí)現(xiàn)。該方法的參數(shù)為一個(gè)color對(duì)象。這個(gè)顏色稱 作xormode顏色。由于xor繪圖模式實(shí)際上是對(duì)新舊 兩種顏色的二進(jìn)制值做異或
34、操作,所以當(dāng)重疊的部分 顏色相同時(shí),將恢復(fù)為背景顏色。這時(shí)候可以通過設(shè) 置xormode顏色,指定用某顏色來替代。例如: 例9.6 xormodedemo.java import java.awt.*; public class xormodedemo extends frame public static void main(string args) xormodedemo frame = new xormodedemo(); 第9章 java在多媒體中的應(yīng)用 frame.setsize(300, 100); frame.setvisible(true); public void paint
35、(graphics g) / draw a pink oval g.setcolor(color.pink); g.filloval(20, 30, 100, 50); / draw a yellow rectangle over part of the oval g.setcolor(color.yellow); g.fillrect(100, 30, 100, 50); / draw an orange rectangle g.setcolor(color.orange); 第9章 java在多媒體中的應(yīng)用 g.filloval(190, 30, 80, 50); / set xor mo
36、de to yellow g.setxormode(color.yellow); g.filloval(180, 45, 60, 20); / draw a blue arc g.setcolor(color.blue); g.fillarc(150, 40, 20, 20, 0, 360); / draw a red square g.setcolor(color.red); g.fillrect(120, 45, 20, 20); 第9章 java在多媒體中的應(yīng)用 程序繪制了六種不同的形狀,前三種為覆蓋模式, 后三種為異或模式。大家可以通過運(yùn)行結(jié)果中圖形重 疊部分看出兩種不同繪圖模式的效果
37、。程序運(yùn)行結(jié)果 如圖9.6所示。 第9章 java在多媒體中的應(yīng)用 圖 9.6 第9章 java在多媒體中的應(yīng)用 9.3 font類的使用類的使用 java 2d具有復(fù)雜文本的輸出能力。java 2d和一個(gè) 重新設(shè)計(jì)的字體引擎支持使用屬性集對(duì)字符串的單個(gè) 字符進(jìn)行操作。 9.3.1 字體 字體是一套具有一個(gè)點(diǎn)尺寸和外觀的字符類型集 合,例如,所有10點(diǎn)helvetica英文字符和符號(hào)組成一 個(gè)字體。文本所使用的字體定義特定的外觀、大小和 式樣(黑體、斜體或者普通體)。 第9章 java在多媒體中的應(yīng)用 字體如何定義特定外觀呢?字體是從字形(glyphs) 創(chuàng)建的,一個(gè)字形是一個(gè)位映像圖像,它定
38、義字體中 的字符和符號(hào)的外觀。同一字體家族的字體都有相似 的外觀,因?yàn)樗麄兪褂猛粋€(gè)字形創(chuàng)建。同樣的,不 同的字體家族使用不同的字形得到相互區(qū)分的外觀。 一個(gè)字體家族不但由具有相似外觀的字體組成, 還包括不同的大小和式樣。helvetica 10 point黑體和 helvetica 12 point斜體是同一家族中的兩個(gè)不同字體, 而times roman 8 point黑體和times roman 10 point普 通體是另一個(gè)家族的兩個(gè)不同字體。 第9章 java在多媒體中的應(yīng)用 為了使用一個(gè)字體,需要?jiǎng)?chuàng)建一個(gè)font對(duì)象,而 為了做到這個(gè),則需要知道系統(tǒng)中有什么字體可用以 及它們的名
39、字。字體有邏輯名、家族名和字體名。 邏輯名是被映射到平臺(tái)上,可用的特定字體的名 字。調(diào)用java.awt.font.getname類可以得到一個(gè)font對(duì) 象的邏輯名。 第9章 java在多媒體中的應(yīng)用 家族名是字體家族的名字,它通過不同的外觀決 定排版圖案,例如,helvetica或者times new roman。 要得到一個(gè)font對(duì)象的家族名,須調(diào)用 java.awt.font.getfamily類。 字體名代表家族中的特定字體,例如helvetica bold。要得到一個(gè)font對(duì)象的字體名,須調(diào)用 java.awt.font.getfontname類。要決定系統(tǒng)上哪些字體 可用,須
40、調(diào)用 java.awt.graphicsenvironment.getallfonts類。 第9章 java在多媒體中的應(yīng)用 9.3.2 創(chuàng)建和派生字體 創(chuàng)建一個(gè)字體的最簡(jiǎn)單的方法是指定字體名、大小 和式樣。一旦你有一個(gè)font對(duì)象,你就可以通過調(diào)用 font.derivefont方法在存在的字體上派生任意個(gè)新font對(duì) 象,并指定新的大小、樣式、變換(位置、傾斜、縮放或 者旋轉(zhuǎn))或者屬性映射。例如 font boldfont = new font(helvetica, font.bold, 12); font italicderived = boldfont.derivefont(font.
41、italic, 12); font plainderived = boldfont.derivefont(font.plain, 14); 第9章 java在多媒體中的應(yīng)用 一旦你有一個(gè)字體,你就可以用它創(chuàng)建一個(gè) textlayout對(duì)象并繪制藝術(shù)字。 java.awt.font.textlayout類可以讓你使用字符、字體和 屬性集創(chuàng)建藝術(shù)字。一旦被創(chuàng)建,textlayout對(duì)象就不 可編輯,但是它的方法可以讓你訪問布局、字體、脫 字符,選擇和點(diǎn)擊測(cè)試信息。 下面的代碼使用font,textlayout和 fontrendercontext 對(duì)象繪制了一個(gè)簡(jiǎn)單的文本,使用 的是24 poin
42、t times黑體。 第9章 java在多媒體中的應(yīng)用 例9.7 timesb.java import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.font.*; public class timesb extends canvas private image img; publicc timesb() setbackground(color.white); public void paint(graphics g) 第9章 java在多媒體中的應(yīng)用 graphics2d g2; g2
43、 = (graphics2d)g; g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on); ontrendercontext frc = g2.getfontrendercontext(); font f = new font(times,font.bold, 24); string s = new string(24 point times bold); textlayout tl = new textlayout(s, f, frc); dimension thesiz
44、e= getsize(); 第9章 java在多媒體中的應(yīng)用 g2.setcolor(color.green); tl.draw(g2, thesize.width/30, thesize.height/2); public static void main(string s) windowlistener l = new windowadapter() public void windowclosing(windowevent e) system.exit(0); public void windowclosed(windowevent e) system.exit(0); ; 第9章 ja
45、va在多媒體中的應(yīng)用 frame f = new frame(2d text); f.addwindowlistener(l); f.add(center, new timesb(); f.pack(); f.setsize(new dimension(400, 300); f.show(); 程序運(yùn)行結(jié)果如圖9.7所示。 第9章 java在多媒體中的應(yīng)用 圖 9.7 第9章 java在多媒體中的應(yīng)用 程序中,java.awt.font代表系統(tǒng)中可用字體的一個(gè) 實(shí)例;java.awt.textlayout代表不可變的藝術(shù)字?jǐn)?shù)據(jù); java.awt.font.fontrendercontext包
46、含繪制文本時(shí)需要的 正確測(cè)量和定位的信息。 第9章 java在多媒體中的應(yīng)用 9.4 圖圖 像像 處處 理理 正如上一節(jié)所介紹的,graphics類中確實(shí)提供了不 少繪制圖形的方法,但如果用它們?cè)赼pplet運(yùn)行過程中 實(shí)時(shí)地繪制一幅較復(fù)雜的圖形,就好比是在用斧頭和 木塊去制造航天飛機(jī)。因此,對(duì)于復(fù)雜圖形,一般都 事先用專用的繪圖軟件將其繪制好,或者是用其他截 取圖像的工具(如掃描儀、視效卡等)獲取圖像的數(shù)據(jù)信 息,再將它們按一定的格式存入圖像文件中。程序運(yùn) 行時(shí),只要找到圖像文件存貯的位置,將它裝載到內(nèi) 存里,然后在適當(dāng)?shù)臅r(shí)機(jī)將它顯示在屏幕上就可以了。 第9章 java在多媒體中的應(yīng)用 9.
47、4.1 加載和顯示圖像 在awt中,java.awt.image類用于描述圖像,它通 過傳遞一個(gè)image類對(duì)象的引用給 graphics.drawimage(image, int, int, imageobserver)方法, 就可以將圖像在畫布(canvas)或是其他可視組件中顯示 出來。 第9章 java在多媒體中的應(yīng)用 java目前所支持的圖像文件格式只有兩種,分別是 gif和jpeg格式(帶有 .gif、.jpg、.jpeg后綴名的文 件)。因此,若圖像文件是其他格式,就須先將它們轉(zhuǎn) 換為這兩種格式。 java.awt.image是一個(gè)抽象類,它定義的方法提供 對(duì)圖像信息的訪問。下面
48、通過一個(gè)例子來看看如何利 用image類來顯示一幅圖像。 第9章 java在多媒體中的應(yīng)用 例9.8 imagetestapplication.java import java.awt.*; import java.awt.event.*; public class imagetestapplication extends frame insets insets; image im; static public void main(string args) imagetestapplication app = new imagetestapplication(); 第9章 java在多媒體中的
49、應(yīng)用 app.show(); public imagetestapplication() super(image test); im = toolkit.getdefaulttoolkit().getimage(tiger.gif); addwindowlistener(new windowadapter() public void windowclosing(windowevent event) dispose(); system.exit(0); ); 第9章 java在多媒體中的應(yīng)用 public void addnotify() super.addnotify();/ peer is
50、created here insets = getinsets(); setbounds(100, 100, 217 + insets.left, 321 + insets.top); public void paint(graphics g) g.drawimage(im, insets.left, insets.top, this); system.out.println(drawing image.); system.out.println(g.drawimage(im, insets.left, insets.top, this); 第9章 java在多媒體中的應(yīng)用 在應(yīng)用程序中加載圖
51、像必須調(diào)用toolkit類的靜態(tài)方 法getimage(),該方法返回一個(gè)指定圖像文件的image 對(duì)象描述,然后在paint()方法中調(diào)用graphics類的 drawimage()方法,就可以將圖片顯示在當(dāng)前容器中。 第9章 java在多媒體中的應(yīng)用 需要注意的是addnotify()方法,覆蓋這個(gè)方法是為 了得到框架窗口空白區(qū)域的引用,并用它來設(shè)置框架 窗口的大小。這樣做是因?yàn)榭蚣艽翱诘淖笊辖?0,0)坐 標(biāo)是從標(biāo)題欄開始計(jì)算的,如果將圖從(0,0)開始畫, 空白區(qū)域以外(即標(biāo)題欄覆蓋的部分)將會(huì)被裁減,所以 必須從坐標(biāo)(insets.left,insets.top)的位置開始畫圖。程
52、序的運(yùn)行結(jié)果如圖9.8所示。 第9章 java在多媒體中的應(yīng)用 圖 9.8 第9章 java在多媒體中的應(yīng)用 在上面的例子中,查看控制臺(tái)會(huì)發(fā)現(xiàn),paint()方法 被調(diào)用了很多次,這是因?yàn)間etimage()方法是啟動(dòng)一個(gè) 線程來加載圖像的,所以paint()方法被調(diào)用的時(shí)候不一 定已經(jīng)載入了整張圖片,每次只繪出已經(jīng)加載的部分。 第9章 java在多媒體中的應(yīng)用 java這樣采用線程的做法雖然會(huì)提高性能,但是也 為編程帶來了一些問題。例如,上例中的setbounds() 方法中的尺寸是硬編碼(直接寫入數(shù)值)的,這種方法缺 乏通用性,是明確不被推薦的做法。較好的方法是直 接取圖像的尺寸,通過調(diào)用
53、image.getwidth()和 image.getheight()方法可以做到。因?yàn)樵趫D像被完全加 載以前,它們的返回值都是-1,所以要等到圖像加載 完才能調(diào)用它們。 第9章 java在多媒體中的應(yīng)用 如何知道圖像有沒有被加載完呢?awt包為此提 供了mediatracker類用于監(jiān)控圖像的加載過程。使用 mediatracker類分為三步: (1) 創(chuàng)建mediatracker對(duì)象。 (2) 使用mediatracker.addimage()指明要監(jiān)控的圖像 對(duì)象。 (3) 創(chuàng)建try/catch塊,等待和指定與id相關(guān)的圖像 被完全加載。 現(xiàn)在采用mediatracker類來改寫上面的
54、例子。 第9章 java在多媒體中的應(yīng)用 例9.9 imagetestapplication.java import java.awt.*; import java.awt.event.*; public class imagetestapplication extends frame insets insets; image im; int width, height; static public void main(string args) imagetestapplication app = new imagetestapplication(); 第9章 java在多媒體中的應(yīng)用 app
55、.show(); public imagetestapplication() super(image test); mediatracker tracker = new mediatracker(this); im = toolkit.getdefaulttoolkit().getimage(tiger.gif); tracker.addimage(im, 0); try tracker.waitforid(0); catch (interruptedexception e) e.printstacktrace(); width = im.getwidth(this); height = im
56、.getheight(this); 第9章 java在多媒體中的應(yīng)用 addwindowlistener(new windowadapter() public void windowclosing(windowevent event) dispose(); system.exit(0); ); public void addnotify() super.addnotify();/ peer is created here insets = getinsets(); setbounds(100, 100, width + insets.left, height + insets.top); 第9
57、章 java在多媒體中的應(yīng)用 public void paint(graphics g) g.drawimage(im, insets.left, insets.top, this); system.out.println(drawing image.); system.out.println(g.drawimage(im,insets.left, insets.top, this); 再來看看控制臺(tái),可以看到paint()方法只被執(zhí)行 了一次。這說明圖像是被完全加載以后才調(diào)用paint()方 法顯示的。 第9章 java在多媒體中的應(yīng)用 9.4.2 圖像生成 awt除了提供用于描述圖像的ja
58、va.awt.image類外, 還提供了用于圖像處理的java.awt.image包,這個(gè)包的 所有類幾乎都和生產(chǎn)和消費(fèi)圖像有關(guān)。圖像生產(chǎn)者負(fù) 責(zé)產(chǎn)生圖像的位,而圖像消費(fèi)者用于接收?qǐng)D像的位。 注:用于描述圖像的是java.awt包中的image類,它 為圖像提供引用,而java.awt.image包中的類則用于圖 像處理,不要將它們混淆。 第9章 java在多媒體中的應(yīng)用 在java.awt.image包中,提供了圖像源生產(chǎn)者接口 imageproducer,以及用于像素抓取和圖像過濾器的消 費(fèi)者接口imageconsumer。 實(shí)際上,和圖像相關(guān)聯(lián)的位并不存在 java.awt.image中
59、,而是每個(gè)圖像都和一個(gè) imageproducer接口相關(guān)聯(lián),這個(gè)imageproducer真正負(fù) 責(zé)生產(chǎn)圖像的位。 第9章 java在多媒體中的應(yīng)用 awt組件除了可以顯示圖像,還可以創(chuàng)建圖像。 要生成一幅圖像就必須調(diào)用awt組件類提供的方法 createimage(imageproducer)或createimage(int width, int height)。第一個(gè)方法通過給定一個(gè)提供圖像位的 imageproducer參數(shù)來創(chuàng)建圖像;第二個(gè)方法則通過指 定圖像大小來生成圖像。 第9章 java在多媒體中的應(yīng)用 此外,java.awt.toolkit類也擁有創(chuàng)建圖像的能力。 它提供了三
60、種創(chuàng)建圖像的方法: createimage(imageproducer) createimage(byte bits) createimage(byte bits, int offset, int length) 和awt一樣,toolkit類在創(chuàng)建圖像時(shí),也可以通 過給定一個(gè)imageproducer參數(shù)來實(shí)現(xiàn)。另外,它還提 供了兩種方法,從一個(gè)byte數(shù)組創(chuàng)建圖像,該方法是使 用位數(shù)組創(chuàng)建圖像,即我們常用的內(nèi)存圖像。 第9章 java在多媒體中的應(yīng)用 9.4.3 圖像處理 在awt中,提供了大量的方法支持圖像處理,特 別是在java.awt.image包中,為我們提供了一些十分有 用的圖像
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 土地復(fù)墾合同范本
- 初探一年級(jí)之旅
- 成長(zhǎng)足跡模板
- 超越夢(mèng)想游戲領(lǐng)航
- 雙方共同合同范例
- 產(chǎn)品供銷合同范本6
- 合肥培訓(xùn)機(jī)構(gòu)合同范本
- 農(nóng)村訂婚合同范本
- 商品經(jīng)營(yíng)終止合同范本
- 保險(xiǎn)和房屋租賃合同范本
- 《鈉離子電池產(chǎn)業(yè)發(fā)展白皮書》
- 2025中考作文預(yù)測(cè)
- 油氣田開發(fā)專業(yè)危害因素辨識(shí)與風(fēng)險(xiǎn)防控
- 假肢安裝合同范本
- 《重大基礎(chǔ)設(shè)施項(xiàng)目涉及風(fēng)景名勝區(qū)選址論證報(bào)告編制技術(shù)規(guī)范》編制說明
- 2025年中國(guó)中煤能源股份有限公司招聘筆試參考題庫(kù)含答案解析
- 2024年蘇州健雄職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2024年大慶醫(yī)學(xué)高等??茖W(xué)校高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 四川省綿陽(yáng)市2025屆高三上學(xué)期第二次診斷性考試語(yǔ)文試題(含答案)
- 2025年1月 浙江首考英語(yǔ)試卷
- 房屋修繕工程難點(diǎn)、重點(diǎn)分析及應(yīng)對(duì)措施
評(píng)論
0/150
提交評(píng)論