Java知多少(101)映像緩衝技術

來源:互聯網
上載者:User

標籤:

當映像資訊量較大,採用以上直接顯示的方法,可能前面一部分顯示後,顯示後面一部分時,由於後面一部分還未從檔案讀出,使顯示呈斑駁現象。為了提高顯示效果,許多應用程式都採用映像緩衝技術,即先把映像完整裝入記憶體,在緩衝區中繪製映像或圖形,然後將緩衝區中繪製好的映像或圖形一次性輸出在螢幕上。緩衝技術不僅可以解決閃爍問題,並且由於在電腦記憶體中建立映像,程式可以對映像進行像素級處理,完成複雜的映像變換後再顯示。

【例 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)映像緩衝技術

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.