Android圖片使用之Bitmap詳解

轉載請註明出處:http://blog.csdn.net/hlm2016

        Android動畫之Bitmap

        在Android開發中,當你需要在見面中呈現圖片時,經常需要用到ImageView來作爲載體。雖然我們是要做一個動畫,但還是可以用ImageView來承載。因爲按照動畫的播放,我們只要能讓ImageView的佔位圖片不斷髮生變化或替換,就能實現形如GIF一樣的動畫效果了!那麼要讓ImageView實現圖片加載,那我們就需要一個輔助類Bitmap來幫忙來,也就是我們這一節的重頭戲啦(我們這裏指的是程序運行時從手機圖庫或者文件中獲取的圖片,由用戶自己來指定加載的圖片,也就是說在接下來的文章中我會教大家如何獲取系統圖庫並從中加載需要的圖片,有空的同學可以先學習下Intent的用法,當然到時也會一起講的,敬請期待!)

        說到Bitmap與ImageView,相信大家已經有所聽聞,甚至個別朋友已經相當熟練,但是技術不嫌新,知識不怕多呀!所以在這一篇文章中,我不僅會顧及初學者對此的瞭解,同時會加入一些關於這兩個類的進階使用。

        爲什麼要在這裏先講Bitmap與ImageView呢?!其實很簡單,在我開發的--動畫SDK--AnimationForAndroid中經常要用到的就是這兩個了,甚至是兩者結合使用,實現更強大的動畫效果!那麼如何學習這兩個重頭戲呢,我今天還是打算先講Bitmap,怕太多知識點大家一時接受不了!

 

1.Bitmap

    簡介:這是一個Android自帶的圖片操作工具類。使用這個類,我們可以對一張圖片進行一些操作了,比如,圖片畫質的配置、圖片透明度的大小,等等。但是這個類並無法進行自身的實例化,只能依靠一個輔助類來創建一個Bitmap實例,那就是BitmapFactory類。因爲此類在定義時構造函數都必須傳入一個Bitmap實例,所以無法用此類直接實例Bitmap,下面自然會教大家如何實例此類的

    外部可調用的方法:(來自Bitmap.class文件)

public int getDensity() {}//獲取圖片像素密度
public void setDensity(int density) {}//設置圖片像素密度
public void reconfigure(int width, int height, android.graphics.Bitmap.Config config) {}
//對圖片進行重新設置
public void setWidth(int width) {}//設置寬度
public void setHeight(int height) {}//設置高度
public void setConfig(android.graphics.Bitmap.Config config) {}//設置已生成的配置config
public void recycle() {}//
public final boolean isRecycled() {}

public boolean compress(android.graphics.Bitmap.CompressFormat formatint, 
int quality, java.io.OutputStream stream) {}//將圖片另存,見下文詳解

public final int getWidth() {}
public final int getHeight() {}
//Scale是縮放的意思,也就是說看到Scale就可以判斷這是用來指定圖片縮放倍數的
public int getScaledWidth(android.graphics.Canvas canvas) {}
public int getScaledHeight(android.graphics.Canvas canvas) {}
public int getScaledWidth(android.util.DisplayMetrics metrics) {}
public int getScaledHeight(android.util.DisplayMetrics metrics) {}
public int getScaledWidth(int targetDensity) {}
public int getScaledHeight(int targetDensity) {}

public final int getByteCount() {}//獲取圖片的字節數

public final android.graphics.Bitmap.Config getConfig() {}//獲取當前圖片的配置內容

public boolean sameAs(android.graphics.Bitmap other) {}//將當前圖片轉換成傳入的other參數

public void prepareToDraw() {

接下來的這一部分是Bitmap類中的枚舉:

 

   /**
     * Bitmap 保存圖片時指定格式
     */
    public static final enum CompressFormat
    {
        JPEG,
        PNG,
        WEBP,
        ;
    }
    /**
     * Bitmap的配置
     * 指定Biymap的透明度和顏色配比等
     */
    public static final enum Config
    {
        ALPHA_8,
        ARGB_4444,
        ARGB_8888,
        RGB_565,
        ;
    }

 

在這些方法與枚舉裏面有很多值得我們研究的東西了,接下來就讓我帶大家來領略一下這個神奇的Bitmap類吧!

@如何實例化Bitmap ,請看代碼

1. InputStream mIn=new FileInputStream("Bitmap.jpg"); 
       Bitmap mBit = new BitmapFactor().decodeStream(mIn);
2. Bitmap mBit = new BitmapFactor().decodeFile("http//csdn.blog.com/hlm520/Bitmap.jpg");

正如上面代碼所呈現的,實例化Bitmap其實有不同的方式,但偏偏就不能由Bitmap這個類來獲取實例,而是通過BitmapFactory來實現的。顯而易見Factory意思就是加工廠的意思,也就是說我們可以通過這個類進行Bitmap的大部分操作。那麼代碼中有兩個部分:第一部分,我們先通過實例一個InputStream獲得一個輸入流,而這個流持有我們想要的圖片,那麼只要把這個流傳入decodeStream( )中就可以對這個流進行解析,從而得到對應的Bitmap實例,注意這時候的Bitmap已經是一個持有圖片的類了,這時就可以與ImageView結合使其在ImageView中呈現了,不過這部分可是下節的內容哦!;第二部分,同樣是一個實例Bitmap的例子,不過這時沒有了流,直接傳入圖片地址就行了。不過從執行效率來看本人建議使用流的那個方法!!!

@如何將獲得的Bitmap另存至指定文件夾,同樣先看代碼

1. InputStream mIn=new FileInputStream("Bitmap.jpg");//這裏需要捕抓異常,加個try  catch
   Bitmap mBit = new BitmapFactor().decodeStream(mIn);
   if(mBit!=null)
     {
      Bitmap.CompressFormat  mBC=new Bitmap().CompressFormat.PNG;
      OutputStream mOut=new OutputStream("hlm2016.png");
      mBit.compres(mBC,50,mOut) ;
      mOut.flush();
      mOut.close();
     }

在這段代碼中我們同樣獲得一個Bitmap實例,然後如果mBit不爲空,則開始圖片另存的操作,首先獲得一個圖片的保存格式爲PNG,這裏就使用到了CompressFormat這個內部枚舉,其實還可以是JPEG或WEBP格式。不過最好用WEBP吧,因爲它可以進行無損壓縮,也是網絡圖片傳輸經常用到的;然後我們獲得一個輸出流,這個流指定了圖片要保存的地址,同時爲圖片的快速存儲提供可能性,親測流技術相當快!然後,就是將實例過的mBit作爲輸出對象,調用compress方法,傳入參數依次是(圖片格式Format,圖片質量 quality,輸出流 stream),在最後我們將整個流刷新後清空,這時圖片就被存入指定文件中了,是不是很簡單呢!

其實還可以對Bitmap進行一些更高級的配置,不過擔心大家喘不過氣今天就先休息休息吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章