清華大學(xué)張思民Java課件第6章_第1頁
清華大學(xué)張思民Java課件第6章_第2頁
清華大學(xué)張思民Java課件第6章_第3頁
清華大學(xué)張思民Java課件第6章_第4頁
清華大學(xué)張思民Java課件第6章_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Java語言程序設(shè)計

第6章Java圖形與圖像處理

2021/5/91本章內(nèi)容提要1、圖形與圖像描繪2、數(shù)字圖像處理3、java3D基礎(chǔ)2021/5/926.1

圖形與圖形的描繪任何一個圖形對象(java.awt.Component的子類)使用java.awt.Grephics類提供的繪圖方法就可以畫出線條、矩形、圓形等圖形。該方法為:

publicvoidpaint(Graohicsg);2021/5/936.1.1Graphics類【例6-1】繪制直線、矩形和圓的簡單圖形。

圖6.1組件的坐標(biāo)系統(tǒng)2021/5/94Graphics類常用的繪圖方法方法說明drawLine(intx1,inty1,intx2,inty2)繪制一條從(x1,y1)到(x2,y2)的直線drawRect(intx,inty,intw,inth)繪制一個頂點(diǎn)為(x,y),寬為w,高為h的矩形drawOval(intx,inty,intw,inth)繪制一個在頂點(diǎn)為(x,y),寬為w,高為h的矩形內(nèi)接橢圓drawArc(intx,inty,intw,inth,ints1,ints2)繪制一段弧度為從s1到s1+s2的圓弧clearRect(intx1,inty1,intx2,inty2)用當(dāng)前顏色填充的方法清除指定矩形區(qū)。drawString(Strings,intx,inty)在(x,y)處顯示字符串sdrawImage(Imageimage,intx,inty,ImageObserverobserver)在(x,y)處顯示圖像image,observer為加載圖像時的圖像觀察器drawImage(Imageimage,intx,inty,intw,inth,ImageObserverobserver)在w寬h高的矩形區(qū)域內(nèi)顯示圖像,圖像能自動調(diào)整大小比例。2021/5/95

Graphics類的Set/get方法getColor()獲得當(dāng)前圖形的色彩setColor(Colorc)設(shè)置當(dāng)前圖形的色彩getFont()獲得當(dāng)前字體setFont(Fontfont)設(shè)置當(dāng)前字體getClip()獲取當(dāng)前的剪貼板內(nèi)容。setClip(int,int,int,int)將指定的矩形設(shè)置為當(dāng)前的剪貼區(qū)。2021/5/96【例6-2】繪制用色彩填充的笑臉圖形。2021/5/976.1.2Java2D繪制時,只要將Graphics對象強(qiáng)制轉(zhuǎn)化為Graphics2D對象就行。

graphics類還有一些不足,例如缺少改變線條粗細(xì)的方法,也缺少填充一個對象的方法。Graphics2D可以解決這些問題。

2021/5/98【例6-3】設(shè)置線條粗細(xì)2021/5/996.1.3畫布Canvas畫布Canvas類是一個用來繪制圖形的矩形組件,在畫布中可以象在Applet中那樣繪制各種圖形,也可以響應(yīng)鼠標(biāo)和鍵盤事件。

2021/5/9101、創(chuàng)建

Canvas的構(gòu)造方法沒參數(shù),所以使用簡單的語句就可以創(chuàng)建一個畫布對象:

Canvascanvas1=newCanvas();在創(chuàng)建了Canvas對象后,一定要調(diào)用setSize()方法確定這個畫布的大小。

Canvas具有自己的坐標(biāo)系統(tǒng),使用布局管理器可以確定它在其他組件中的位置,并且可以用布局管理器來進(jìn)行版面布局。2021/5/9112、常用方法我們在進(jìn)行程序設(shè)計時,經(jīng)常把要實(shí)現(xiàn)的功能單獨(dú)設(shè)計為一個類,而把顯示這個功能設(shè)計成另一個,我們把實(shí)現(xiàn)功能的類稱為業(yè)務(wù)邏輯層,而顯示功能的類稱為表現(xiàn)層。這樣,把邏輯層和表現(xiàn)層分開,有利于實(shí)現(xiàn)代碼重用??聪旅娴氖纠!纠?-5】通過一個窗體的文本框輸入圓的半徑及坐標(biāo)位置,在畫布上繪制一個圓。以此例說明,邏輯層和表現(xiàn)層間的數(shù)據(jù)傳遞。2021/5/912

(b)在畫布上繪制圓形圖6.6邏輯層與表現(xiàn)層的設(shè)計模式示例

(a)邏輯層和表現(xiàn)層間的數(shù)據(jù)傳遞2021/5/9136.2數(shù)字圖像處理數(shù)字圖像處理技術(shù)就是將圖像信號轉(zhuǎn)換成數(shù)字格式并利用計算機(jī)進(jìn)行處理的過程。我們要用到awt的Image類和java.awt.image包,awt的抽象類Image所有圖形圖像類的父類,java.awt.image包為創(chuàng)建和修改圖像提供了技術(shù)支持。2021/5/9146.2.1圖像文件例:(1)單一灰色(2)漸變灰度。2021/5/9156.2.2圖像的基本操作圖像最基本的操作有三種,它們是創(chuàng)建圖像、加載圖像和顯示圖像。1、創(chuàng)建圖像對象由于圖像最終要在屏幕中顯示出來,java.awt的Component類提供了一個createImage()方法來生成Image圖像對象。

CreateImage()方法有兩種形式:

ImagecreateImage(ImageProducerimgProd);ImagecreateImage(intwidth,intheight);

2021/5/9162、加載圖像獲得圖像的另一種方法是加載圖像。這通過使用由Applet類定義的getImage()方法來實(shí)現(xiàn)。它有以下形式:

ImagegetImage(URLurl)ImagegetImage(URLurl,StringimageName)2021/5/9173、顯示圖像顯示圖像可以用drawImage()方法,drawImage()是Graphics類的方法。它有好幾種形式,我們將要用到下面的一種:

booleandrawImage(ImageimgObj,intleft,inttop,ImageObserverimgOb);2021/5/918【例6-8】用getImage()方法和drawImage()方法加載和顯示圖像。2021/5/9196.2.3雙緩沖

由于加載圖像需要時間,這時我們就會感覺屏幕在不斷閃爍。為了解決這個問題,在內(nèi)存或顯存中開辟一塊緩沖區(qū),把加載的圖像放到緩沖區(qū)中。當(dāng)圖像加載完畢,我們再把圖像從緩沖區(qū)中調(diào)到屏幕上讓它顯示,由于從緩沖區(qū)讀取數(shù)據(jù)的速度很快就不會出現(xiàn)閃爍了。這就稱為雙緩沖。2021/5/920【例6-9】演示雙緩沖技術(shù)的效果。我們創(chuàng)建了一個Image對象,然后在這個Image對象上(而不是在屏幕上)畫圖。畫圖需要用一個Graphics對象。這個Graphics對象可以通過getGraphics()方法來獲得。下面構(gòu)造一個Graphics對象gc,并用紅色填充圖像。

Canvasc=newCanvas();Imagetest=c.createImage(200,100);Graphicsgc=test.getGraphics();gc.setColor(Color.red);gc.fillRect(0,0,200,100);這個圖像是不可見的,僅僅存在于內(nèi)存中。為了真正顯示這個圖像,需調(diào)用drawImage()方法。2021/5/9216.2.4圖像處理技術(shù)1、像素點(diǎn)數(shù)組的構(gòu)成2021/5/922像素點(diǎn)是一個具有Alpha(透明度)、Red(紅)、Green(綠)和Blue(藍(lán))四個分量表示的整數(shù),記作0xAARRGGBB。其中A、R、G、B的取值從0~f(十六進(jìn)制)。紅色:0xffff0000綠色:0xff00ff00藍(lán)色:0xff0000ff白色:0xffffffff黑色:0xff000000圖像的像素點(diǎn)其排列如圖6.14所示,我們按從左往右、從上往下的順序取出像素點(diǎn),構(gòu)成一整型數(shù)組。2021/5/923圖6.14像素數(shù)組元素的排列2021/5/9242、MediaTracker類MediaTracker類用于加載多媒體圖像,使用時,先生成一個MediaTracker對象,再用它的addImage()方法來加載圖像。addImage()方法有以下一般形式:

voidaddImage(ImageimgObj,intimgID)voidaddImage(ImageimgObj,intimgID,intwidth,intheight)2021/5/9253、ImageProducer接口和MemoryImageSource類ImagePruducer是一個用于生成圖像數(shù)據(jù)對象的接口。實(shí)現(xiàn)該接口的對象要用整數(shù)型數(shù)組或字節(jié)型數(shù)組生成Image對象。

MemoryImageSource是用于生成新的圖像的類。它的構(gòu)造函數(shù)如下:

MemoryImageSource(intwidth,intheight,intpixel[],intoffset,intscanLineWidth)2021/5/9264、PixelGrabber類PixelGrabber類的作用是從現(xiàn)有的圖像中提取像素數(shù)據(jù)構(gòu)造一個像素數(shù)組。在使用PixelGrabber時,首先需要生成一個足夠大的int型的數(shù)組來存儲像素數(shù)據(jù),然后生成一個PixelGrabber實(shí)例對象,將提取到的圖像數(shù)據(jù)存入到一個矩形區(qū)域中。最后,這個實(shí)例對象中調(diào)用grabPixels()方法將數(shù)據(jù)值放進(jìn)像素數(shù)組中。2021/5/927【例6-11】將圖像進(jìn)行反相處理示例。2021/5/9286.3.1Java3D概述Java3D的安裝和運(yùn)行:到其官方網(wǎng)站:/products/java-media/3D/下載最新的系統(tǒng)安裝程序。Java3D安裝完畢后,在JDK目錄下的jre\lib\ext子目錄下,應(yīng)有四個.jar文件:j3daudio.jar、j3dcore.jar、j3dutils.jar、vecmath.jar,在JDK目錄下的jre\bin子目錄下,應(yīng)有J3D.dll、j3daudio.dll、J3DUtils.dll文件。另外,在demo目錄下的java3d中有系統(tǒng)提供的示例程序。2021/5/9296.3.2Java3D程序設(shè)計1、Java3D的基本體系結(jié)構(gòu)2021/5/9302、幾個基本概念(1)虛擬空間在Java3D中,虛擬空間被定義為結(jié)合一系列對象的三維空間。虛擬空間被用作最大的聚集體表現(xiàn)單位,同時也可被看作一個數(shù)據(jù)庫。對于一個Java3D應(yīng)用程序,必須定義一個虛擬空間才可以在“空間”中顯示三維圖像。2021/5/931(2)坐標(biāo)系統(tǒng)默認(rèn)情況下,Java3D的坐標(biāo)系統(tǒng)是右旋的三維坐標(biāo)體系(3)場景為了支持大型虛擬空間,Java3D提出了“場景Locale”的概念。一個場景和與它結(jié)合的坐標(biāo)系一起組成了在虛擬空間之下的一個表現(xiàn)層。虛擬空間可以包含一個或多個場景。而所有其他的對象都附加在一個場景之中。2021/5/9323、Java3D設(shè)計方法構(gòu)造一個Java3D應(yīng)用程序,必須首先創(chuàng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論