1. 程式人生 > >Android Bitmap

Android Bitmap

memory width 矩陣 pad bcb https bbf 設置顏色 str

1. 初識Bitmap


Bitmap是一個final類,因此不能被繼承。Bitmap只有一個構造方法,且該構造方法是沒有任何訪問權限修飾符修飾,也就是說該構造方法是friendly,但是谷歌稱Bitmap的構造方法是private(私有的),感覺有點不嚴謹。不管怎樣,一般情況下,我們不能通過構造方法直接新建一個Bitmap對象。
Bitmap是Android系統中的圖像處理中最重要類之一。Bitmap可以獲取圖像文件信息,對圖像進行剪切、旋轉、縮放,壓縮等操作,並可以以指定格式保存圖像文件。

2. 創建Bitmap對象


既然不能直接通過構造方法創建Bitmap,那怎樣才能創建Bitmap對象。通常我們可以利用Bitmap的靜態方法createBitmap()

和BitmapFactory的decode系列靜態方法創建Bitmap對象。

  • Bitmap的靜態方法createBitmap()

    技術分享

  • BitmapFactory的decode系列靜態方法

    技術分享

3. Bitmap的顏色配置信息與壓縮方式信息


Bitmap中有兩個內部枚舉類:ConfigCompressFormatConfig是用來設置顏色配置信息的,CompressFormat是用來設置壓縮方式的。

技術分享

  • Config解析:

    通常我們優化Bitmap時,當需要做性能優化或者防止OOM(Out Of Memory),我們通常會使用Bitmap.Config.RGB_565這個配置,因為Bitmap.Config.ALPHA_8

    只有透明度,顯示一般圖片沒有意義,Bitmap.Config.ARGB_4444顯示圖片不清楚,Bitmap.Config.ARGB_8888占用內存最多。

    • Bitmap.Config.ALPHA_8:顏色信息只由透明度組成,占8位。

    • Bitmap.Config.ARGB_4444:顏色信息由透明度與R(Red),G(Green),B(Blue)四部分組成,每個部分都占4位,總共占16位。

    • Bitmap.Config.ARGB_8888:顏色信息由透明度與R(Red),G(Green),B(Blue)四部分組成,每個部分都占8位,總共占32位。是Bitmap默認的顏色配置信息,也是最占空間的一種配置。

    • Bitmap.Config.RGB_565:顏色信息由R(Red),G(Green),B(Blue)三部分組成,R占5位,G占6位,B占5位,總共占16位。

  • CompressFormat解析:

    • Bitmap.CompressFormat.JPEG:表示以JPEG壓縮算法進行圖像壓縮,壓縮後的格式可以是".jpg"或者".jpeg",是一種有損壓縮。

    • Bitmap.CompressFormat.PNG:表示以PNG壓縮算法進行圖像壓縮,壓縮後的格式可以是".png",是一種無損壓縮。

    • Bitmap.CompressFormat.WEBP:表示以WebP壓縮算法進行圖像壓縮,壓縮後的格式可以是".webp",是一種有損壓縮,質量相同的情況下,WebP格式圖像的體積要比JPEG格式圖像小40%。美中不足的是,WebP格式圖像的編碼時間“比JPEG格式圖像長8倍”。

4. Bitmap對圖像進行操作


1. Bitmap裁剪圖像

Bitmap裁剪圖像有兩種方式:

  • Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)

根據源Bitmap對象source,創建出source對象裁剪後的圖像的Bitmap。x,y分別代表裁剪時,x軸和y軸的第一個像素,width,height分別表示裁剪後的圖像的寬度和高度。
註意:x+width要小於等於source的寬度,y+height要小於等於source的高度。

  • Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)

這個方法只比上面的方法多了mfilter這兩個參數,m是一個Matrix(矩陣)對象,可以進行縮放,旋轉,移動等動作,filter為true時表示source會被過濾,僅僅當m操作不僅包含移動操作,還包含別的操作時才適用。其實上面的方法本質上就是調用這個方法而已。

技術分享

2. Bitmap縮放,旋轉,移動圖像

Bitmap縮放,旋轉,移動,傾斜圖像其實就是通過Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)方法實現的,只是在實現這些功能的同時還可以實現圖像的裁剪。

技術分享

Matrix的postScalepostRotate方法還有多帶兩個參數的重載方法postScale(float sx, float sy, float px, float py)postRotate(float degrees, float px, float py),後兩個參數pxpy都表示以該點為中心進行操作。
註意:雖然Matrix還可以調用postSkew方法進行傾斜操作,但是卻不可以在此時創建Bitmap時使用。

3. Bitmap保存圖像與釋放資源

技術分享

5. BitmapFactory通過BitmapFactory.Options對圖像進行操作


BitmapFactory是通過BitmapFactory.Options對圖像進行操作的,然後將操作後的圖像生成Bitmap對象或者將操作後的圖像用已經存在的Bitmap保存,當不能用之保存時會返回null
BitmapFactory.Options中常用的字段有:

技術分享

  • inBitmap:如果設置將會將生成的圖像內容加載到該Bitmap對象中。

  • inDensity:給Bitmap對象設置的密度,如果inScaled為true(這是默認的),而若inDensityinTargetDensity不匹配,那麽就會在Bitmap對象返回前將其縮放到匹配inTargetDensity

  • inDither:是否對圖像進行抖動處理,默認值是false。

  • inJustDecodeBounds:如果設置成true,表示獲取Bitmap對象信息,但是不將其像素加載到內存。

  • inPreferredConfig:Bitmap對象顏色配置信息,默認是Bitmap.Config.ARGB_8888

  • inSampleSize:對圖像進行壓縮,設置的值為2的整數次冪或者接近2的整數次冪,當次設置為2時,寬和高為都原來的1/2,圖像所占空間為原來的1/4。

  • inScaled:設置是否縮放。

  • inTargetDensity:繪制到目標Bitmap上的密度。

  • outHeight:Bitmap對象的高度。

  • outWidth:Bitmap對象的寬度。

6. 使用Bitmap時防止OOM的有效方法


1. 高效壓縮圖片

技術分享

2. 使用緩存

常用的緩存有內存緩存LruCache和磁盤緩存DiskLruCache

Android界面性能調優手冊

https://androidtest.org/android-graphics-performance-pattens/?utm_medium=email&utm_source=gank.io

Android Bitmap