Android Bitmap

1. 初識Bitmap


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

2. 建立Bitmap對象


既然不能直接經過構造方法建立Bitmap,那怎樣才能建立Bitmap對象。一般咱們能夠利用Bitmap的靜態方法createBitmap()和BitmapFactory的decode系列靜態方法建立Bitmap對象。web

  • Bitmap的靜態方法createBitmap()算法

  • BitmapFactory的decode系列靜態方法緩存

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


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

  • Config解析:post

    一般咱們優化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默認的顏色配置信息,也是最佔空間的一種配置。code

    • 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

相關文章
相關標籤/搜索