天天看點

Android圖像處理之Bitmap類

Bitmap是Android系統中的圖像處理的最重要類之一。用它可以擷取圖像檔案資訊,進行圖像剪切、旋轉、縮放等操作,并可以指定格式儲存圖像檔案。本文從應用的角度,着重介紹怎麼用Bitmap來實作這些功能。

Bitmap的生成

1.1 BitmapFactory decode出Bitmap

Bitmap實作在android.graphics包中。但是Bitmap類的構造函數是私有的,外面并不能執行個體化,隻能是通過JNI執行個體化。這必然是 某個輔助類提供了建立Bitmap的接口,而這個類的實作通過JNI接口來執行個體化Bitmap的,這個類就是BitmapFactory。      

Android圖像處理之Bitmap類

Android圖像處理之Bitmap類

圖一、BitmapFactory主要方法及Options選項

利用BitmapFactory可以從一個指定檔案中,利用decodeFile()解出Bitmap;也可以定義的圖檔資源中,利用decodeResource()解出Bitmap。

1.2 decode時的選項

在使用方法decodeFile()/decodeResource()時,都可以指定一個BitmapFacotry.Options。

利用Options的下列屬性,可以指定decode的選項:

inPreferredConfig 指定decode到記憶體中,手機中所采用的編碼,可選值定義在Bitmap.Config中。預設值是ARGB_8888。

inJustDecodeBounds 如果設定為true,并不會把圖像的資料完全解碼,亦即decodeXyz()傳回值為null,但是Options的outAbc中解出了圖像的基本資訊。

inSampleSize 設定decode時的縮放比例。

利用Options的這些值就可以高效的得到一幅縮略圖。

Android圖像處理之Bitmap類

Android圖像處理之Bitmap類

圖二、BitmapFactory.decodeFile()

先設定inJustDecodeBounds= true,調用decodeFile()得到圖像的基本資訊[Step#2~4];

利用圖像的寬度(或者高度,或綜合)以及目标的寬度,得到inSampleSize值,再設定inJustDecodeBounds= false,調用decodeFile()得到完整的圖像資料[Step#5~8]。

先擷取比例,再讀入資料,如果欲讀入大比例縮小的圖,将顯著的節約内容資源。有時候還會讀入大量的縮略圖,這效果就更明顯了。

利用Bitmap和Matrix實作圖像變換

Bitmap可以和Matrix結合實作圖像的剪切、旋轉、縮放等操作。      

Android圖像處理之Bitmap類

Android圖像處理之Bitmap類

圖三、Bitmap方法

用源Bitmap通過變換生成新的Bitmap的方法:

public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height, 
            Matrix m, boolean filter) 
public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height) 
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, 
            int dstHeight,boolean filter)      

第一個方法是最終的實作,後兩種隻是對第一種方法的封裝。

第二個方法可以從源Bitmap中指定區域(x,y, width, height)中挖出一塊來實作剪切;第三個方法可以把源Bitmap縮放為dstWidth x dstHeight的Bitmap。

設定Matrix的Rotate(通過setRotate())或者Scale(通過setScale()),傳入第一個方法,可實作旋轉或縮放。

Android圖像處理之Bitmap類

Android圖像處理之Bitmap類

圖四、Bitmap實作旋轉

儲存圖像檔案

經過圖像變換之後的Bitmap裡的資料可以儲存到圖像壓縮檔案裡(JPG/PNG)。      

Android圖像處理之Bitmap類

Android圖像處理之Bitmap類

圖五、儲存Bitmap資料到檔案