標籤:
當映像資訊量較大,採用以上直接顯示的方法,可能前面一部分顯示後,顯示後面一部分時,由於後面一部分還未從檔案讀出,使顯示呈斑駁現象。為了提高顯示效果,許多應用程式都採用映像緩衝技術,即先把映像完整裝入記憶體,在緩衝區中繪製映像或圖形,然後將緩衝區中繪製好的映像或圖形一次性輸出在螢幕上。緩衝技術不僅可以解決閃爍問題,並且由於在電腦記憶體中建立映像,程式可以對映像進行像素級處理,完成複雜的映像變換後再顯示。
【例 12-6】小應用程式程式示範映像緩衝顯示技術。程式運行時,當滑鼠在映像地區內按下時,映像會出現邊框,托動滑鼠時,映像也隨之移動。抬起滑鼠後,邊框消失。程式將兩種狀態的映像先放入兩個緩衝區,當滑鼠拖動時,不斷地在新的位置重繪滑鼠按下樣式的映像滑鼠抬起時,重繪滑鼠抬起樣式的映像。
1 滑鼠抬起時,重繪滑鼠抬起樣式的映像。 2 import java.applet.*; 3 import java.awt.*; 4 imprt java.awt.image. * ; 5 import javax.swing.*; 6 import java.event.*; 7 public class Example7_6 extends Applet{ 8 Image myPicture; 9 /*init()方法中,先定義一個Image對象,並賦予createImage()方法的傳回值,接著建立Graphics對象並賦予其圖形環境。最後,讓Graphics對象調用drawImage()方法顯示映像。10 由於這裡的Graphics對象offScreenGc是非螢幕對象是,小程式視窗不會有映像顯示*/11 public void init(){12 myPicture = getImage(getCodeBase(), "myPic.JPG");13 Image offScreenImage = createImage(size().width, size().height);14 Graphics offScreenGc = offScreenImage.getGraphics();15 new BufferedDemo(myPicture);16 }17 /*drawImage()方法的第四個參數是實現ImageObserver介面,在init()方法中,調用drawImage()方法的參數是this,所以小程式要定義imageUpdate()方法*/18 public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){19 if (infoFlg = ALLBITS){ // 表示映像已全部裝入記憶體20 repaint();21 return false;// 防止線程再次調用imageUpdate()方法22 }23 else24 return true;25 }26 }27 /*程式的執行過程是,當小程式調用drawImage()方法時,drawImage()方法將建立一個調用 imageUpdate()方法的線程,在imageUpdate()方法中,測定映像是否已在部分調入記憶體。建立的線程不斷調用imageUpdate()方法,直到該方法返回false為止。參數infoFlg使小程式能知道映像裝入記憶體的情況。當infoFlg等於ALLBITS時,表示映像已全部裝入記憶體。當該方法發現映像已全部裝入記憶體後,置imageLoaded為真,並調用repaint()方法重畫小程式視窗。方法返回false防止線程再次調用imageUpdate()方法。*/28 class BufferedDemo extends JFrame{29 public BufferedDemo(Image img){30 this.getContentPane().add(new PicPanel(img));31 setTile("雙緩技術示範");32 setSize(300, 300);33 setVisible(true);34 }35 }36 class PicPane extends JPanel implements MouseListener, MouseMotionListener{37 int x = 0, y = 0, dx = 0, cy = 0;38 BufferedImage bimg1, bimg2;39 boolean upstate = true;40 public picPanel(Image img){41 this.setBackground(Color.white);42 this.addMouseListener(this);43 this.addMouseMotionListener(this);44 bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this),45 BufferedImage.TYPE_INT_ARGB);46 bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this),47 BufferedImage.TYPE_INT_ARGB);48 Graphics2D g2D1 = bimg1.createGraphics();49 Graphics2D g2D2 = bimg2.createGraphics();50 g2D1.drawImage(img, 0, 0, this);51 g2D2.drawImage(img, 0, 0, this);52 g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3);53 }54 public void paintComponent(Graphics g){55 super.painComponent(g);56 Graphics2D g2D = (Graphics2D)g;57 if (upState)58 g2D.drawImage(bimg1, x, y, this);59 else60 g2D.drawImage(bimg2.x, y, this);61 }62 public void mousePress(MouseEvent e){63 if (e.getX() >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){64 upstate = false;65 setCursor(Cursor.getPredefinedCursor(Coursor.HAND_CURSOR));66 dx = e.getX() - x;67 dy = e.getY() - y;68 repain();69 }70 }71 public void mouseExited(MouseEvent e){}72 public void mouseClicked(MouseEvent e){}73 public void mouseEntered(MouseEvent e){}74 public void MouseReleased(MouseEvent e){75 this.setCursor(Cursor.getpredefinedCursor(Cursor.DEFAULT_CURSOR));76 upState = true;77 repaint();78 }79 public void mouseMoved(MouseEvent e){}80 public void mouseDragged(MouseEvent e){81 if (!upState){82 x = e.getX() - dx;83 y = e.getY() - dy;84 repaint();85 }86 }87 }
程式要建立緩衝區映像,需要引入java.awt.image包中的BufferedImage類。要建立一個緩衝區圖,可以調用createImage()方法,該方法返回一個Image對象,然後再將它轉換成一個BufferedImage對象。例如,代碼:
BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
也可利用以下構造方法來建立。
BufferedImage(int width,int heigh, int imageType);
其中參數 imageType是映像類型。
使用緩衝區顯示映像,需先在緩衝區中準備好映像,再將緩衝區中的映像顯示在介面上。顯示映像需要繪圖物件Graphics,可以通過以下方法建立:
Graphics2D g2d = bimge.createGraphics();
系列文章:
Java知多少(上)Java知多少(中)Java知多少(78)Java向量(Vector)及其應用Java知多少(79)雜湊表及其應用Java知多少(80)圖形介面設計基礎Java知多少(81)架構視窗基礎Java知多少(82)標籤、按鈕和按鈕事件簡介Java知多少(83)面板基礎:JPanel和JScrollPaneJava知多少(84)圖形介面之布局設計Java知多少(85)文字框和文本區Java知多少(86)文字框和文本區的輸入輸出Java知多少(87)選擇框和選項按鈕Java知多少(88)列表和組合框Java知多少(89)列表和組合框Java知多少(90)菜單Java知多少(91)對話方塊Java知多少(92)捲軸Java知多少(93)滑鼠事件Java知多少(94)鍵盤事件Java知多少(95)繪圖基礎Java知多少(96)繪圖之設定字型和顏色Java知多少(97)繪圖模式概述Java知多少(98)Graphics類的繪圖方法Java知多少(99)Graphics2D類的繪圖方法Java知多少(100)影像處理基礎
Java知多少(101)映像緩衝技術