舉例解析Java的圖像緩沖技術(shù)的使用
當(dāng)圖像信息量較大,采用以上直接顯示的方法,可能前面一部分顯示后,顯示后面一部分時(shí),由于后面一部分還未從文件讀出,使顯示呈斑駁現(xiàn)象。為了提高顯示效果,許多應(yīng)用程序都采用圖像緩沖技術(shù),即先把圖像完整裝入內(nèi)存,在緩沖區(qū)中繪制圖像或圖形,然后將緩沖區(qū)中繪制好的圖像或圖形一次性輸出在屏幕上。緩沖技術(shù)不僅可以解決閃爍問(wèn)題,并且由于在計(jì)算機(jī)內(nèi)存中創(chuàng)建圖像,程序可以對(duì)圖像進(jìn)行像素級(jí)處理,完成復(fù)雜的圖像變換后再顯示。
【例】小應(yīng)用程序程序演示圖像緩沖顯示技術(shù)。程序運(yùn)行時(shí),當(dāng)鼠標(biāo)在圖像區(qū)域內(nèi)按下時(shí),圖像會(huì)出現(xiàn)邊框,托動(dòng)鼠標(biāo)時(shí),圖像也隨之移動(dòng)。抬起鼠標(biāo)后,邊框消失。程序?qū)煞N狀態(tài)的圖像先放入兩個(gè)緩沖區(qū),當(dāng)鼠標(biāo)拖動(dòng)時(shí),不斷地在新的位置重繪鼠標(biāo)按下樣式的圖像鼠標(biāo)抬起時(shí),重繪鼠標(biāo)抬起樣式的圖像。
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()方法中,先定義一個(gè)Image對(duì)象,并賦予createImage()方法的返回值,接著創(chuàng)建Graphics對(duì)象并賦予其圖形環(huán)境。最后,讓Graphics對(duì)象調(diào)用drawImage()方法顯示圖像。
由于這里的Graphics對(duì)象offScreenGc是非屏幕對(duì)象是,小程序窗口不會(huì)有圖像顯示*/
public void init(){
myPicture = getImage(getCodeBase(), "myPic.JPG");
Image offScreenImage = createImage(size().width, size().height);
Graphics offScreenGc = offScreenImage.getGraphics();
new BufferedDemo(myPicture);
}
/*drawImage()方法的第四個(gè)參數(shù)是實(shí)現(xiàn)ImageObserver接口,在init()方法中,調(diào)用drawImage()方法的參數(shù)是this,所以小程序要定義imageUpdate()方法*/
public boolean imageUpdate(Image img, int infoFlg, int x, int y, int w, int h){
if (infoFlg = ALLBITS){ // 表示圖像已全部裝入內(nèi)存
repaint();
return false;// 防止線程再次調(diào)用imageUpdate()方法
}
else
return true;
}
}
/*程序的執(zhí)行過(guò)程是,當(dāng)小程序調(diào)用drawImage()方法時(shí),drawImage()方法將創(chuàng)建一個(gè)調(diào)用 imageUpdate()方法的線程,在imageUpdate()方法中,測(cè)定圖像是否已在部分調(diào)入內(nèi)存。創(chuàng)建的線程不斷調(diào)用imageUpdate()方法,直到該方法返回false為止。參數(shù)infoFlg使小程序能知道圖像裝入內(nèi)存的情況。當(dāng)infoFlg等于ALLBITS時(shí),表示圖像已全部裝入內(nèi)存。當(dāng)該方法發(fā)現(xiàn)圖像已全部裝入內(nèi)存后,置imageLoaded為真,并調(diào)用repaint()方法重畫小程序窗口。方法返回false防止線程再次調(diào)用imageUpdate()方法。*/
class BufferedDemo extends JFrame{
public BufferedDemo(Image img){
this.getContentPane().add(new PicPanel(img));
setTile("雙緩技術(shù)演示");
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();
}
}
}
程序要?jiǎng)?chuàng)建緩沖區(qū)圖像,需要引入java.awt.image包中的BufferedImage類。要?jiǎng)?chuàng)建一個(gè)緩沖區(qū)圖,可以調(diào)用createImage()方法,該方法返回一個(gè)Image對(duì)象,然后再將它轉(zhuǎn)換成一個(gè)BufferedImage對(duì)象。例如,代碼:
BufferedImage bimage = (BufferedImage)this.createImage(this.getWidth(),this.getHeight());
也可利用以下構(gòu)造方法來(lái)建立。
BufferedImage(int width,int heigh, int imageType);
其中參數(shù) imageType是圖像類型。
使用緩沖區(qū)顯示圖像,需先在緩沖區(qū)中準(zhǔn)備好圖像,再將緩沖區(qū)中的圖像顯示在界面上。顯示圖像需要圖形對(duì)象Graphics,可以通過(guò)以下方法建立:
Graphics2D g2d = bimge.createGraphics();
相關(guān)文章
java.io.EOFException: Unexpected end of
本文主要介紹了java.io.EOFException: Unexpected end of ZLIB input stream異常解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Spring中Bean創(chuàng)建完后打印語(yǔ)句的兩種方法
這篇文章主要介紹了Spring中Bean創(chuàng)建完后打印語(yǔ)句的兩種方法,一個(gè)是實(shí)現(xiàn)InitializingBean接口,另一個(gè)使用@Bean注解和initMethod屬性,通過(guò)代碼示例介紹的非常詳細(xì),感興趣的小伙伴可以參考閱讀2023-07-07
idea中的Maven導(dǎo)包失敗問(wèn)題解決方案匯總
這篇文章主要介紹了idea中的Maven導(dǎo)包失敗問(wèn)題解決總結(jié),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
Java實(shí)現(xiàn)文件讀取和寫入過(guò)程解析
這篇文章主要介紹了Java實(shí)現(xiàn)文件讀取和寫入過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值。,需要的朋友可以參考下2019-10-10
spring4.3 實(shí)現(xiàn)跨域CORS的方法
下面小編就為大家分享一篇spring4.3 實(shí)現(xiàn)跨域CORS的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件
這篇文章主要介紹了如何處理maven倉(cāng)庫(kù)中后綴LastUpdated文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
springboot controller無(wú)效的處理方案
這篇文章主要介紹了springboot controller無(wú)效的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10

