舉例解析Java的圖象緩沖技巧的應用。本站提示廣大學習愛好者:(舉例解析Java的圖象緩沖技巧的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例解析Java的圖象緩沖技巧的應用正文
當圖象信息量較年夜,采取以上直接顯示的辦法,能夠後面一部門顯示後,顯示前面一部門時,因為前面一部門還未從文件讀出,使顯示呈班駁景象。為了進步顯示後果,很多運用法式都采取圖象緩沖技巧,即先把圖象完全裝入內存,在緩沖區中繪制圖象或圖形,然後將緩沖區中繪制好的圖象或圖形一次性輸入在屏幕上。緩沖技巧不只可以處理閃耀成績,而且因為在盤算機內存中創立圖象,法式可以對圖象停止像素級處置,完成龐雜的圖象變換後再顯示。
【例】小運用法式法式演示圖象緩沖顯示技巧。法式運轉時,當鼠標在圖象區域內按下時,圖象會湧現邊框,托動鼠標時,圖象也隨之挪動。抬起鼠標後,邊框消逝。法式將兩種狀況的圖象先放入兩個緩沖區,當鼠標拖動時,赓續地在新的地位重繪鼠標按下款式的圖象鼠標抬起時,重繪鼠標抬起款式的圖象。
import java.applet.*; import java.awt.*; imprt java.awt.image. * ; import javax.swing.*; import java.event.*; public class Example7_6 extends Applet{ Image myPicture; /*init()辦法中,先界說一個Image對象,並付與createImage()辦法的前往值,接著創立Graphics對象並付與其圖形情況。最初,讓Graphics對象挪用drawImage()辦法顯示圖象。 因為這裡的Graphics對象offScreenGc長短屏幕對象是,小法式窗口不會有圖象顯示*/ public void init(){ myPicture = getImage(getCodeBase(), "myPic.JPG"); Image offScreenImage = createImage(size().width, size().height); Graphics offScreenGc = offScreenImage.getGraphics(); new BufferedDemo(myPicture); } /*drawImage()辦法的第四個參數是完成ImageObserver接口,在init()辦法中,挪用drawImage()辦法的參數是this,所以小法式要界說imageUpdate()辦法*/ public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){ if (infoFlg = ALLBITS){ // 表現圖象已全體裝入內存 repaint(); return false;// 避免線程再次挪用imageUpdate()辦法 } else return true; } } /*法式的履行進程是,當小法式挪用drawImage()辦法時,drawImage()辦法將創立一個挪用 imageUpdate()辦法的線程,在imageUpdate()辦法中,測定圖象能否已在部門調入內存。創立的線程赓續挪用imageUpdate()辦法,直到該辦法前往false為止。參數infoFlg使小法式能曉得圖象裝入內存的情形。當infoFlg等於ALLBITS時,表現圖象已全體裝入內存。當該辦法發明圖象已全體裝入內存後,置imageLoaded為真,並挪用repaint()辦法重畫小法式窗口。辦法前往false避免線程再次挪用imageUpdate()辦法。*/ class BufferedDemo extends JFrame{ public BufferedDemo(Image img){ this.getContentPane().add(new PicPanel(img)); setTile("雙緩技巧演示"); setSize(300, 300); setVisible(true); } } class PicPane extends JPanel implements MouseListener, MouseMotionListener{ int x = 0, y = 0, dx = 0, cy = 0; BufferedImage bimg1, bimg2; boolean upstate = true; public picPanel(Image img){ this.setBackground(Color.white); this.addMouseListener(this); this.addMouseMotionListener(this); bimg1 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); bimg2 = new BufferedImage(img.getWidth(this), img.getHeight(this), BufferedImage.TYPE_INT_ARGB); Graphics2D g2D1 = bimg1.createGraphics(); Graphics2D g2D2 = bimg2.createGraphics(); g2D1.drawImage(img, 0, 0, this); g2D2.drawImage(img, 0, 0, this); g2D2.drawRect(1, 1, img.getWidth(this) - 3, img.getHeight(this) - 3); } public void paintComponent(Graphics g){ super.painComponent(g); Graphics2D g2D = (Graphics2D)g; if (upState) g2D.drawImage(bimg1, x, y, this); else g2D.drawImage(bimg2.x, y, this); } public void mousePress(MouseEvent e){ if (e.getX() >= x && e.getX() < x + bimg1.getWidth(this) && e.getY() >= y&& e.getY() < y + bimg1.getHeight(this)){ upstate = false; setCursor(Cursor.getPredefinedCursor(Coursor.HAND_CURSOR)); dx = e.getX() - x; dy = e.getY() - y; repain(); } } public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void MouseReleased(MouseEvent e){ this.setCursor(Cursor.getpredefinedCursor(Cursor.DEFAULT_CURSOR)); upState = true; repaint(); } public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e){ if (!upState){ x = e.getX() - dx; y = e.getY() - dy; repaint(); } } }
法式要創立緩沖區圖象,須要引入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();