Java程序設(shè)計課件(高曉黎)第十章文本顯示與圖形圖像處理_第1頁
Java程序設(shè)計課件(高曉黎)第十章文本顯示與圖形圖像處理_第2頁
Java程序設(shè)計課件(高曉黎)第十章文本顯示與圖形圖像處理_第3頁
Java程序設(shè)計課件(高曉黎)第十章文本顯示與圖形圖像處理_第4頁
Java程序設(shè)計課件(高曉黎)第十章文本顯示與圖形圖像處理_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第十章 文本顯示與圖形圖像處理 第1章走馬觀花看Java目 錄 重點與難點點撥Java繪圖基礎(chǔ) Java圖像處理 經(jīng)典練習(xí)題Graphics繪圖 字體設(shè)置 本章知識重點3132GUI組件及Graphics類的繪圖方法 33字體設(shè)置34基本圖形繪制的各方法及畫布CanvasJava圖像處理35與圖形圖像處理相關(guān)的類 本章知識難點33基本圖形繪制的各方法及畫布Canvas343132GUI組件及Graphics類的繪圖方法 字體設(shè)置及顏色設(shè)置圖像的靜態(tài)、動態(tài)處理Java繪圖基礎(chǔ) Java的繪圖機(jī)制 與圖形圖像處理相關(guān)的類 java中支持圖形圖像處理的類與接口主要定義于java.awt類庫中31Ja

2、va繪圖基礎(chǔ)Graphics類 Graphics類中封裝了幾乎所有的圖形處理的方法,該類用于在一個二維坐標(biāo)系中繪制圖形與顯示格式化文字。由于Graphics類定義于java.awt包中,在繪制圖形的程序中,必須引入java.awt,即在程序開頭需加上以下語句: import java.awt.*; 或import java.awt.Graphics;32Java繪圖基礎(chǔ) Graphics類的繪圖區(qū)域為能夠繪制并顯示圖形的一些組件,坐標(biāo)原點在組件的左上角,X軸為水平方向,坐標(biāo)值從左至右逐漸增大,Y軸在垂直方向,坐標(biāo)值從上向下逐漸增大。Java坐標(biāo)的度量單位是像素,在Java的圖形坐標(biāo)系統(tǒng)中,坐標(biāo)

3、值只能為整數(shù)。由于不同的平臺具體實現(xiàn)繪圖功能中存在著一定差異,Graphics類為抽象類,不能用new命令創(chuàng)建Graphics類實例對象,Java只提供給用戶一個不依賴于具體平臺的通用接口,使用戶能夠調(diào)用Graphics類的各種繪圖方法,實現(xiàn)繪圖與繪制文本的功能。Java繪圖基礎(chǔ) GUI程序中,文本的輸出顯示是作為圖形對象來處理的,控制臺應(yīng)用程序中的System.out.println()方法,只能以DOS字符的形式,在命令行窗口上顯示文字。GUI界面中字符串信息的顯示,要使用Graphics或Graphics2D提供的繪制字符或字符串信息的成員方法。圖形文本33Java繪圖基礎(chǔ)Graphic

4、s類提供了三種繪制文字的方法:字符串輸出方法:drawString(String s,int x,int y)。字符數(shù)組輸出方法:drawChars(char s,int offset,int length,int x,int y)。字節(jié)數(shù)組輸出方法:drawBytes(byte s,int offset,int length,int x,int y)。其中x、y參數(shù)為字符串輸出的位置坐標(biāo)。例如:g. drawString(“我的愛好是讀書和聽音樂”,50,100);語句將會繪出一串文本,輸出位置坐標(biāo)為(50,100) 。Java繪圖基礎(chǔ) GUI編程中,Color類定義了操作顏色的常量與方法,

5、該類的完整包路徑為java.awt.Color。 Color類常用的三種構(gòu)造方法的定義為:public Color(int r,int g,int b);public Color(float r,float g,float b);public Color(int rgb);Color類中封裝了常用的13種標(biāo)準(zhǔn)顏色的符號常量。如: Color.BLACK Color.WHITE Color.RED Color.GREEN Color.BLUE Color.YELLOW 等顏色設(shè)置34Java繪圖基礎(chǔ)此外,Color類還提供了獲取RGB顏色分量的對應(yīng)方法:public int getRed();

6、/獲取當(dāng)前顏色的紅色分量值(范圍為0,255)。public int getGreen(); /獲取當(dāng)前顏色的綠色分量值(范圍為0,255)。public int getBlue(); /獲取當(dāng)前顏色的藍(lán)色分量值(范圍為0,255)。 Java繪圖基礎(chǔ) 如創(chuàng)建一個以粉紅色pink(RGB值為:255,175,175)前景顯示“姓名”的標(biāo)簽對象,可用以下語句實現(xiàn):Color labelColor=new Color(255,175,175);Label lblName=new Label(“姓名”);lblName.setForeground(labelColor);或者用以下等價的方式實現(xiàn):L

7、abel lblName=new Label(“姓名”);lblName.setForeground(Color.PINK);Java繪圖基礎(chǔ) java.awt.Component類作為大多數(shù)GUI組件的基類,定義了paint()方法,用來實現(xiàn)在組件上繪制圖形的功能。applet小程序的基類:Applet或Japplet,也間接地由Component類派生,因此applet小程序也具有paint()方法 paint()方法定義:void paint(Graphics g); paint()方法通常由系統(tǒng)自動調(diào)用,用戶一般不能直接在程序中顯式調(diào)用它,而是通過repaint()方法來間接調(diào)用它。組

8、件首次顯示外觀時,applet小程序在被加載運(yùn)行時,系統(tǒng)都會調(diào)用相關(guān)的paint()方法。 GUI組件的繪圖方法Component類與paint()方法 31Java繪圖基礎(chǔ)此外,Component類中還定義了另外兩個直接或間接調(diào)用paint()方法的方法:更新方法update(Graphics g);當(dāng)組件的尺寸、外觀等被改變時,系統(tǒng)將調(diào)用此方法,重新繪制組件。update()方法的實現(xiàn)中包含了對paint()方法的調(diào)用。重繪方法repaint();該方法沒有參數(shù),執(zhí)行時會清除組件的原有背景圖形,并使用paint()方法重新繪制該組件。用戶可以在程序中直接調(diào)用repaint()方法,當(dāng)組件為

9、輕量級組件時,該方法會直接調(diào)用paint()方法,否則會通過調(diào)用update()方法間接調(diào)用paint()方法。 Java繪圖基礎(chǔ)【例】在一個300200的Frame窗口內(nèi),用紅色繪制四葉玫瑰曲線。Java繪圖基礎(chǔ)import java.awt.*;import java.awt.event.*;import java.awt.Color;public class Exa_10_1 extends Frame private static final double PI=3.1415926; private int appWidth,appHeight; public Exa_10_1(Str

10、ing title) super(title); this.setSize(300,200); /實現(xiàn)關(guān)閉窗口的功能 this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); Java繪圖基礎(chǔ)public void paint(Graphics g) super.paint(g);/調(diào)用父類的繪制方法 /獲取當(dāng)前窗口的寬度與高度值 appWidth=this.getWidth(); appHeight=this.getHeight(); int o

11、x,oy,x,y; /設(shè)置原點(ox,oy)的坐標(biāo)為當(dāng)前窗口中心 ox=appWidth/2; oy=appHeight/2; g.setColor(Color.RED); /設(shè)置繪圖的前景色 Java繪圖基礎(chǔ)/繪制坐標(biāo)軸 g.drawLine(ox,10,ox,appHeight); g.drawLine(0,oy,appWidth,oy); /定義控制角度與半徑變化的變量 int i,j=10; double angle,r; while (j100) for(i=0;i1023;i+) /計算最新的角度 angle = i*PI/512; r = j*Math.sin(2*angle);

12、 Java繪圖基礎(chǔ)/計算最新的軌跡點坐標(biāo) x =(int)Math.round(r*Math.cos(angle)*2); y =(int)Math.round(r*Math.sin(angle); g.fillOval(ox+x,oy+y,1,1); /畫軌跡點 j = j + 5; /增進(jìn)的步長 public static void main(String args) Exa_10_1 app=new Exa_10_1(Paint() Method Usage); app.setVisible(true); Java繪圖基礎(chǔ) 組件的基類Component類提供了一組get類型的方法用來獲取

13、當(dāng)前繪圖上下文環(huán)境的一些重要參數(shù)。getGraphics()為當(dāng)前組件創(chuàng)建 graphics上下文環(huán)境getGraphicsConfiguration()獲取相關(guān)的Graphics設(shè)置getForeground()獲取與當(dāng)前組件的前景顏色getBackground()獲取與當(dāng)前組件的背景顏色getFont()獲取與當(dāng)前組件的字體對象getFontMetrics(Font font)獲取指定字體的樣式信息Component類的get/set方法組32Java繪圖基礎(chǔ)Component類還提供了一組用來設(shè)置外觀與行為的set方法:setEnabled(),設(shè)置組件的可用性。setVisible()

14、,設(shè)置組件的可見性。setForeground(),設(shè)置組件的前景色。setBackground(),設(shè)置組件的背景色。setBounds(),設(shè)置組件的起始位置與尺寸大小。setLocation(),設(shè)置組件的起始位置。setSize(),設(shè)置組件的尺寸大小。setPreferredSize(),設(shè)置組件首選的尺寸。setMaximumSize(),設(shè)置組件的最大尺寸。setMinimumSize(),設(shè)置組件的最小尺寸。此外,常用的還有一個設(shè)置組件顯示文字字體類型與樣式的一個方法:public void setFont(Font f)。Java繪圖基礎(chǔ)【例】用組件的getGraphics(

15、)方法實現(xiàn)如下所述的功能:在一個300200的JFrame窗口內(nèi),放置一個標(biāo)簽與一個按鈕,當(dāng)點擊按鈕后,標(biāo)簽中繪制一個黃色的橢圓,并在橢圓內(nèi)顯示藍(lán)色的RGB值。Java繪圖基礎(chǔ)import java.awt.*;import java.awt.event.*;import java.awt.Color;import javax.swing.*;public class Exa_10_2 extends JFrame implements ActionListener private JLabel jlblDraw=new JLabel(); private JButton jbtnDraw=n

16、ew JButton(開始繪圖); public Exa_10_2(String title) super(title); this.setSize(300,200); jlblDraw.setSize(300,150); /實現(xiàn)關(guān)閉窗口的功能 Java繪圖基礎(chǔ)this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jbtnDraw.addActionListener(this); Container contentPane=this.getContentPane(); contentPane.setLayout(new BorderLayou

17、t(); contentPane.add(jlblDraw,BorderLayout.CENTER); contentPane.add(jbtnDraw,BorderLayout.SOUTH); /按鈕點擊事件響應(yīng)方法 public void actionPerformed(ActionEvent e) /創(chuàng)建標(biāo)簽的Graphics上下文環(huán)境 Graphics g=jlblDraw.getGraphics(); Java繪圖基礎(chǔ)/用黃色畫一填充橢圓 g.setColor(Color.YELLOW); g.fillOval(50,10,200,130); /用藍(lán)色顯示當(dāng)前顏色的字符串 g.set

18、Color(Color.BLUE); g.drawString(g.getColor().toString(),65,75); /使按鈕變得不再可用 jbtnDraw.setEnabled(false); public static void main(String args) Exa_10_2 app=new Exa_10_2(getGraphics() Method Usage); app.setVisible(true); Java繪圖基礎(chǔ)paintComponent(),用來繪制幾何圖形,渲染圖形文字。paintComponent()方法的原型定義如下:protected void p

19、aintComponent(Graphics g);JComponent類的paintComponent()方法與Component類的paint()具有完全相同的參數(shù)形式,兩種方法的功能與使用也基本類似。 JComponent類與paintComponent()方法 33Java繪圖基礎(chǔ) Swing應(yīng)用中,經(jīng)常會在JPanel組件中繪制圖形。通常的做法是:定義一個JPanel類的子類,在該子類中覆蓋/重寫類的paintComponent()方法,在方法體內(nèi)放入繪圖的操作語句。然后再將該JPanel組件添加到主窗口的內(nèi)容窗格(ContentPane)內(nèi)。 具體的實現(xiàn)結(jié)構(gòu)類似于如下的代碼: cl

20、ass drawPanel extends Jpanel public void paintComponent(Graphics g) / super.paintComponent(g); /相關(guān)的圖形或文字繪制語句 字體設(shè)置 一個Font類的對象表示了一種字體顯示效果,包括字體類型、Font MyFont = new Font ( TimesRoman, Font.BOLD, 12 ); MyFont對應(yīng)的是12磅TimesRoman類型的黑體字,其中指定字型時要用到Font類三個常量:Font.PLAIN, Font.BOLD, Font.ITALIC。如果希望使用該Font對象,則可以利

21、用Graphics類的setFont( )方法: g. setFont ( MyFont );如果希望指定控制組件,如按鈕或文本框中的字體效果,則可以使用控制組件的方法setFont( )。如設(shè)btn是一個按鈕對象,則語句: btn.setFont(MyFont);另外,與setFont( )方法相對的getFont( )方法將返回當(dāng)前Graphics或組件對象使用的字體。Font類字體設(shè)置【例】獲取當(dāng)前系統(tǒng)中所有可用字體的名稱,在標(biāo)簽中顯示出這些可用字體的數(shù)目,在文本區(qū)中顯示出這些可用字體的名稱。 字體設(shè)置import java.awt.*;import javax.swing.*;impo

22、rt java.awt.event.*;public class Exa_10_4 extends JFrame implements ActionListener /定義GUI所涉及的組件 JLabel jlblTotalFonts=new JLabel(); JButton jbtnDisp=new JButton(顯示當(dāng)前可用字體名稱); JTextArea jtxtaFontNames=new JTextArea(); JScrollPane jsclpane4txtArea=new JScrollPane(jtxtaFontNames); 字體設(shè)置 public Exa_10_4(S

23、tring title) super(title); jbtnDisp.addActionListener(this); /為標(biāo)簽組件設(shè)置前景色為紅色 jlblTotalFonts.setForeground(new Color(255,0,0); /設(shè)置文本區(qū)組件為不可編輯狀態(tài) jtxtaFontNames.setEditable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /添加各個組件到窗口的內(nèi)容窗格中 Container contentPane=this.getContentPane(); contentPa

24、ne.setLayout(new BorderLayout(); contentPane.add(jlblTotalFonts,BorderLayout.NORTH); 字體設(shè)置contentPane.add(jsclpane4txtArea,BorderLayout.CENTER); contentPane.add(jbtnDisp,BorderLayout.SOUTH); this.setSize(300,300); this.setVisible(true); /響應(yīng)按鈕點擊事件 public void actionPerformed(ActionEvent e) jbtnDisp.se

25、tEnabled(false); /使自己失效以免兩次被點擊 String availableFontNames; /獲取當(dāng)前平臺可用的字體集 GraphicsEnvironment ge=GraphicsEnvironment.字體設(shè)置getLocalGraphicsEnvironment(); availableFontNames=ge.getAvailableFontFamilyNames(); /當(dāng)前平臺可用字體的總數(shù) int total=availableFontNames.length; jlblTotalFonts.setText(當(dāng)前平臺系統(tǒng)可用的字體總數(shù)為: +total+)

26、; /將當(dāng)前平臺可用字體名稱添加到文本區(qū)中 for (int k=0;ktotal;k+) jtxtaFontNames.append(availableFontNamesk+n); public static void main(String args) new Exa_10_4(Font Usage Demo); 字體設(shè)置FontMetrics類定義了字體的規(guī)格對象,提供了比Font類更詳盡的特定字體的描述信息。這些信息可以通過調(diào)用FontMetrics類的相關(guān)方法來獲得。FontMetrics類提供了獲取文字樣式中各類規(guī)格信息的成員方法。 創(chuàng)建FontMetrics類對象要通過調(diào)用Gra

27、phics類的getFontMetrics()方法來實現(xiàn)。如:public void paint(Graphics g) FontMetrics fm = g.getFontMetrics(); FontMetrics類字體設(shè)置【例】編程實現(xiàn)演示FontMetrics類的字體規(guī)格信息。用一根粗黑線表示Baseline,另外三根分別表示字體的Leading、Ascent和Descent的位置。窗口頂端包含輸入顯示文本內(nèi)容的文本域及三個用來選擇字體名稱、字體樣式及字號的組合列表框。當(dāng)在文本域中輸入新的內(nèi)容并敲回車,或者改變了任何一個組合列表框的當(dāng)前選擇,都會使字體規(guī)格信息的演示內(nèi)容發(fā)生變化。Gra

28、phics繪圖 利用Graphics類可繪制的圖形有直線、各種矩形、多邊形、圓和橢圓等。下面的例子綜合了這些方法。Graphics類的繪圖方法Graphics繪圖import java.awt.*;import java.applet.Applet;public class DrawFigures extends Applet public void paint ( Graphics g) g.drawLine(30,5,40,5); /畫直線 g.drawRect(40,10,50,20);/畫矩形框(左上角x坐標(biāo), y坐標(biāo),x軸尺寸,y軸尺寸) g.fillRect(60,30,70,40

29、); /畫實心矩形 g.drawRoundRect(110,10,130,50,30,30); /畫圓角矩形框 g.drawOval(150,120,70,40); /畫橢圓形框(左上角x坐標(biāo),左上角y坐標(biāo),x軸尺 寸,y軸尺寸),若x 軸尺寸與y軸尺寸相等,則畫出圓形 g.fillOval(190,160,70,40); /畫實心橢圓Graphics繪圖 g.drawOval(90,100,50,40); /畫橢圓框 g.fillOval(130,100,50,40); /畫實心橢圓 drawMyPolygon(g); /自定義的畫多邊形的方法 g.drawString(They are f

30、igures!,100,220); public void drawMyPolygon( Graphics g) int xCoords = 30,50,65,119,127; /保存多邊形各點x坐標(biāo)的數(shù)組 int yCoords = 100, 140,127,169,201; /保存多邊形各點y坐標(biāo)數(shù)組 g.drawPolygon( xCoords,yCoords,5); /畫自由多邊形框 Graphics繪圖 要在Java程序圖形界面的容器中繪制圖形,首先,需要明確希望繪制的圖形是什么,是圓、橢圓,還是直線,這由所選定的方法來確定;其次,需要指明所繪制圖形或文字的大小和位置,Graphic

31、s繪圖繪制直線的方法格式為: drawline(intx1, inty1, intx2, inty2)。其中整型參數(shù)對(x1,y1)代表直線的起點,(x2,y2)代表直線的終點。基本圖形繪制 點(Point) 直線(Line)3132Graphics繪圖【1】普通矩形線條方式:drawRect( (int x,int y,int w,int h) 填充方式:fillRect( int x,int y,int w,int h) 【參數(shù)說明】(x,y)為矩形的左上角坐標(biāo);w為矩形的寬度;h為矩形的高度。drawRect()和fillRect()方法的唯一不同之處在于:fillRect()方法畫出矩

32、形框后用前景色將其填充。矩形(Rectangle)33 Graphics類中提供了三種矩形類型。這三類矩形都包括線條 方式與填充方式兩類繪圖方法。Graphics繪圖【2】圓角矩形線條方式:drawRoundRect(int x,int y,int w,int h, int arcWidth,int arcHeight)填充方式:fillRoundRect(int x,int y,int w,int h, int arcWidth,int arcHeight)【參數(shù)說明】圓角性質(zhì)參數(shù)arcWidth與arcHeight,分別代表了圓角弧對應(yīng)橢圓的的長軸(水平軸)與短軸(垂直軸)。圓角矩形的圓角

33、性質(zhì)參數(shù)的意義見圖10.12。當(dāng)arcWidth=w且arcHeight=h時,圓角矩形就成為一個橢圓。因此可用繪制圓角矩形的方法生成橢圓。Graphics繪圖【3】立體矩形線條方式:draw3DRect(int x,int y,int w,int h,boolean raised)填充方式:fill3DRect(int x,int y,int w,int h,boolean raised) 【參數(shù)說明】布爾型的raised參數(shù)用來控制立體矩形的凸出或凹入效果。raised為true時,畫出的立體矩形是凸起的;raised為false時,畫出的立體矩形是凹陷的。Graphics繪圖橢圓繪制方法

34、與普通矩形的方法在形式上相同的,這是因為橢圓的規(guī)格大小是用它的外接矩形來指定的。線條方式:drawOval(int x ,int y ,int w ,int h)填充方式:fillOval(int x ,int y ,int w ,int h)【參數(shù)說明】x、y參數(shù)代表橢圓外接矩形的左上角位置坐標(biāo)。參數(shù)w、h代表橢圓外接矩形的寬度和高度。橢圓(Oval)34Graphics繪圖圓弧是橢圓的一部分,夾在兩個角之間,因此畫圓弧的方法比畫橢圓的方法多了兩個角度參數(shù)(都以角度為單位):起始角和張角。起始角確定了圓弧的起始位置,張角確定了圓弧的大小。張角可正可負(fù),當(dāng)取正值時,畫出的為沿逆時針方向的圓弧;

35、取負(fù)值時,畫出的為沿順時針方向的圓弧。當(dāng)張角取值大于360時,畫出的就是橢圓。圓弧(Arc)35Graphics繪圖drawArc()方法畫出的是一段圓弧,而fillArc()方法畫出的是一個扇形。線條方式:drawArc(int x ,int y ,int w ,int h ,int startAngle ,int arcAngle)填充方式:fillArc(int x ,int y ,int w,int h ,int startAngle ,int arcAngle)【參數(shù)說明】前四個參數(shù)x、y、w和h規(guī)定了圓弧所對應(yīng)橢圓的規(guī)格大小。startAngle表示圓弧的起始角。arcAngle表

36、示圓弧的張角,可取正負(fù)整數(shù)值代表有方向的角度。 Graphics繪圖 線條方式畫出的多邊形一般是不封閉的,除非首頂點與尾頂點坐標(biāo)值一樣。但填充方式畫出的填充多邊形則為封閉的多邊形,因為填充不應(yīng)該溢出多邊形的有效范圍。 根據(jù)繪制所采用的數(shù)據(jù)表達(dá)方式的不同,多邊形的繪制方法可分為兩組,每一組又具有線條與填充兩種繪制方式。多邊形(Polygon)36Graphics繪圖第一組:用坐標(biāo)數(shù)組作為多邊形的頂點序列繪制多邊形:線條方式:drawPolygon(int xPoints,int yPPoints,int nPoints) 填充方式:fillPolygon(int xPts,int yPts,in

37、t n)【參數(shù)說明】xPoints與yPPoints為兩個數(shù)組,分別保存多邊形多個頂點的X坐標(biāo)值與Y坐標(biāo)值。兩個數(shù)組的長度應(yīng)該相等nPoints表示多邊形頂點的個數(shù),其值不能超過兩個數(shù)組的長度。多邊形繪制方法將兩個數(shù)組對應(yīng)的頂點按順序用直線連接起來,組成一個多邊形,多邊形的頂點坐標(biāo)序列為:(xPoints0,yPPoints0),(xPoints1,yPPoints1)(xPointsn,yPPointsn)。Graphics繪圖第二組:用Polygon對象作為數(shù)據(jù)源繪制多邊形:線條方式:drawPolygon(Polygon p)填充方式:fillPolygon(Polygon p)【參數(shù)說

38、明】參數(shù)p為Polygon對象。Polygon類是java.awt包內(nèi)提供的工具類,該類封裝了一個封閉區(qū)域的節(jié)點坐標(biāo)序列。該類具有以下構(gòu)造方法:Polygon(),創(chuàng)建一個空的多邊形對象。Polygon(int xpoints, int ypoints, int npoints),創(chuàng)建以指定參數(shù)為初始化值的多邊形對象。其參數(shù)意義與drawPolygon()方法相同。 Polygon類具有addPoint(int x, int y)成員方法,用來將一個指定點的坐標(biāo)添加到多邊形對象中。畫布Canvas Canvas是java.awt包中用來繪圖的矩形組件,其作用類似于Windows的畫圖板,用戶可

39、在這塊區(qū)域上直接畫出圖形。Canvas繼承自Component類,具有Paint(Graphics g)、update(Graphics g)及repaint()方法,能夠響應(yīng)鼠標(biāo)和鍵盤事件,并具有自己的坐標(biāo)系統(tǒng)。畫布提供了一塊專門的圖形區(qū)域,通過設(shè)定自己的邊界而和其它組件區(qū)分開,以保護(hù)畫面不被覆蓋。即使畫面被破壞,仍可通過調(diào)用Canvas的paint()方法重畫圖形,恢復(fù)原有的狀態(tài)。Canvas類的構(gòu)造方法有兩種形式: 無參構(gòu)造方法Canvas(),用來創(chuàng)建一個新的畫布對象。有參構(gòu)造方法Canvas(GraphicsConfiguration config),創(chuàng)建一個適用于指定的繪圖配置對象

40、的的畫布對象。畫布Canvas如Canvas canvas1=new Canvas();語句就創(chuàng)建了一個空白的畫布對象。創(chuàng)建了Canvas對象后,還要調(diào)用setSize()方法設(shè)定這個畫布的大小。 Canvas類的重要方法包括:paint(Graphics g),用來在畫布上繪制圖形。void update(Graphics g),用來更新畫布。用戶無法直接使用Canvas的paint()方法,使用時需要先定義一個以Canvas為基類的子類,并在子類中重寫paint()方法;然后在子類的paint()方法中,借助于方法的Graphics對象參數(shù),調(diào)用Graphics類的繪圖方法,實現(xiàn)用戶的繪圖

41、操作。畫布Canvas【例】使用畫布實現(xiàn)以下功能:在畫布上沿一條水平直線,從左到右繪制一系列的圓,圓的半徑逐步增大,所有圓的圓心坐標(biāo)在水平直線上。畫布Canvasimport java.awt.*;import javax.swing.*;import java.awt.Color;/建立一個Canvas類的子類class MulOvalsCanvas extends Canvas private int oy; private int canvasWidth; /構(gòu)造方法中設(shè)置畫布尺寸 public MulOvalsCanvas() this.setSize(450,250); oy=(th

42、is.getHeight()-30)/2; canvasWidth=this.getWidth(); 畫布Canvas/重寫paint()方法 public void paint(Graphics g) int ox=12; int r=10; /繪制水平直線 g.setColor(Color.RED); g.drawLine(0,oy,canvasWidth,oy); /沿水平直線繪制一系列的圓 g.setColor(Color.BLUE); /構(gòu)造循環(huán)體 while (ox+r)(canvasWidth-15) g.drawOval(ox-r,oy-r,2*r,2*r); r+=5; ox

43、+=15; 畫布Canvaspublic class Exa_10_11 extends JFrame /建立一個JPanel子類的對象 MulOvalsCanvas multipleOvals=new MulOvalsCanvas(); public Exa_10_11(String title) super(title); this.setSize(450,250); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane=this.getContentPane(); contentPane.ad

44、d(multipleOvals); this.setVisible(true); public static void main(String args)Exa_10_11 app=new Exa_10_11(Canvas Usage Demo);Java圖像處理 靜態(tài)圖像處理 常用的圖像文件格式有BMP、JPEG、GIF、PNG等格式。圖像的基本操作 Java中處理圖像的基本操作主要包括:創(chuàng)建圖像對象,獲取圖像資源,加載圖像,顯示圖像等。Java圖像處理java.awt的Component類提供了一個createImage()方法來生成Image圖像對象。CreateImage()方法有兩種

45、重載形式:Image createImage(ImageProducer producer);方法的第一種形式從一個指定的圖像產(chǎn)生器producer創(chuàng)建一幅圖像并由方法返回。producer是一個現(xiàn)實了ImageProducer接口的類對象。Image createImage(int width, int height);方法的第二種形式創(chuàng)建并返回一幅具有指定寬度和高度的空白圖像。創(chuàng)建圖像對象31Java圖像處理獲取本地圖像資源通過java.awt.Toolkit類的靜態(tài)方法getDefaultToolkit(),獲得當(dāng)前默認(rèn)的Toolkit(工具包)對象,然后再使用Toolkit類的getI

46、mage()方法,就可以從指定的文件中讀取GIF、JPEG或PNG格式的圖像數(shù)據(jù)了。例如:從本機(jī)上獲取名為myPhoto.gif的文件內(nèi)容,并將文件中的圖像數(shù)據(jù)生成Image對象myPhoto的語句序列為:String fileName = “myPhoto.gif”;Image myPhoto = olkit.getDefaultToolkit().getImage(fileName);獲取圖像資源32Java圖像處理獲取網(wǎng)絡(luò)圖像資源如果要獲取的圖像資源在網(wǎng)絡(luò)上,則需要使用URL類來得到圖像。Applet類提供了getCodeBase()方法,用以返回一個URL對象,該URL對象代表了app

47、let小程序在網(wǎng)絡(luò)上地址。通常的做法為:用網(wǎng)絡(luò)地址與圖像文件名組成的字符串生成一個URL對象,然后使用Toolkit類的getImage()方法,讀取遠(yuǎn)程的圖像數(shù)據(jù),創(chuàng)建對應(yīng)的圖像對象。例如要獲取Sun公司的標(biāo)志圖片文件sun_logo.gif:URL url = new URL(“/im/sun_logo.gif”);Image sunLogo = Toolkit.getDefaultToolkit().getImage(url);Java圖像處理java.applet.Applet類提供了getImage()方法來實現(xiàn)圖像的加載。通過getImage()方法,能夠?qū)PEG、GIF或PNG

48、格式的圖像文件轉(zhuǎn)換為Image對象,便于在程序中進(jìn)行操作。getImage()方法有以下兩種重載形式:Image getImage(URL url);/參數(shù)url指定了圖像資源的位置路徑與名稱。Image getImage(URL url, String imageName);/參數(shù)指定了圖像的位置路徑及圖像文件名稱的Image類的一個實例對象。加載圖像33Java圖像處理Java應(yīng)用程序中圖像的顯示要通過調(diào)用Graphics類的drawImage()方法來實現(xiàn)。drawImage()方法有6種重載形式,可根據(jù)需要任選一種來使用。下面給出drawImage()眾多重載方法中的一種:boolea

49、n drawImage(Image imgObj, int left, int top, ImageObserver imgOb);該方法顯示由imgObj對象所引用的圖像文件,顯示區(qū)域的左上角坐標(biāo)為(left,top)。ImgOb是一個實現(xiàn)了ImageObserver接口的類的對象。ImageObserver接口由所有的AWT組件所實現(xiàn)。例如,要顯示本機(jī)上myPhoto.gif文件中的圖像:public void paintComponent(Graphics g)Image myPhoto=Toolkit.getDefaultToolkit().getImage(“myPhoto.gif”

50、);g.drawImage(myPhoto, 90, 60, null);顯示圖像34Java圖像處理【例】在窗口中顯示當(dāng)前目錄下card.jpg圖像文件的內(nèi)容。 Java圖像處理import java.awt.*;import javax.swing.*;/建立一個JPanel類的子類class DrawImage extendsJPanel/重寫paintComponent()方法 public void paintComponent(Graphics g) /調(diào)用父類的paintComponent()方法 super.paintComponent(g);/獲取圖像資源并創(chuàng)建Image對象

51、Image cardImage=Toolkit.getDefaultToolkit().getImage(card.jpg); /將當(dāng)前圖像原始尺寸縮小一半顯示 int showWidth=cardImage.getWidth(this)/2; int showHeight=cardImage.getHeight(this)/2; g.drawImage(cardImage,15,10,showWidth,showHeight,this); Java圖像處理public class Exa_10_12 extends JFrameDrawImage christmasCard=new DrawImage(); public Exa_10_12(String title) super(title); /設(shè)置窗口大小 this.setSize(260,230); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane=this.getContentPane(); contentPane.add(chri

溫馨提示

  • 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

提交評論