Bitmap是一個final類,所以不能被繼承。Bitmap只有一個構造方法,且該構造方法是沒有任何訪問權限修飾符修飾,也就是說該構造方法是friendly,可是谷歌稱Bitmap的構造方法是private(私有的),感受有點不嚴謹。無論怎樣,通常狀況下,咱們不能經過構造方法直接新建一個Bitmap對象。
Bitmap是Android系統中的圖像處理中最重要類之一。Bitmap能夠獲取圖像文件信息,對圖像進行剪切、旋轉、縮放,壓縮等操做,並能夠以指定格式保存圖像文件。android
既然不能直接經過構造方法建立Bitmap,那怎樣才能建立Bitmap對象。一般咱們能夠利用Bitmap的靜態方法createBitmap()
和BitmapFactory的decode
系列靜態方法建立Bitmap對象。web
Bitmap的靜態方法createBitmap()
算法
BitmapFactory的decode
系列靜態方法緩存
Bitmap中有兩個內部枚舉類:Config
和CompressFormat
,Config
是用來設置顏色配置信息的,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倍」。
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)
這個方法只比上面的方法多了m
和filter
這兩個參數,m
是一個Matrix(矩陣)對象,能夠進行縮放,旋轉,移動等動做,filter
爲true時表示source會被過濾,僅僅當m
操做不只包含移動操做,還包含別的操做時才適用。其實上面的方法本質上就是調用這個方法而已。
Bitmap縮放,旋轉,移動,傾斜圖像其實就是經過Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)
方法實現的,只是在實現這些功能的同時還能夠實現圖像的裁剪。
Matrix的postScale
和postRotate
方法還有多帶兩個參數的重載方法postScale(float sx, float sy, float px, float py)
和postRotate(float degrees, float px, float py)
,後兩個參數px
和py
都表示以該點爲中心進行操做。
注意:雖然Matrix還能夠調用postSkew
方法進行傾斜操做,可是卻不能夠在此時建立Bitmap時使用。
BitmapFactory是經過BitmapFactory.Options對圖像進行操做的,而後將操做後的圖像生成Bitmap對象或者將操做後的圖像用已經存在的Bitmap保存,當不能用之保存時會返回null
。
BitmapFactory.Options中經常使用的字段有:
inBitmap
:若是設置將會將生成的圖像內容加載到該Bitmap對象中。
inDensity
:給Bitmap對象設置的密度,若是inScaled
爲true(這是默認的),而若inDensity
與inTargetDensity
不匹配,那麼就會在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對象的寬度。
經常使用的緩存有內存緩存LruCache
和磁盤緩存DiskLruCache
。
Android界面性能調優手冊
https://androidtest.org/android-graphics-performance-pattens/?utm_medium=email&utm_source=gank.io