Bitmap是一個final類,因此不能被繼承。Bitmap只有一個構造方法,且該構造方法是沒有任何訪問權限修飾符修飾,也就是說該構造方法是friendly,但是谷歌稱Bitmap的構造方法是private(私有的),感覺有點不嚴謹。不管怎樣,一般情況下,我們不能通過構造方法直接新建一個Bitmap對象。
Bitmap是Android系統中的圖像處理中最重要類之一。Bitmap可以獲取圖像文件信息,對圖像進行剪切、旋轉、縮放,壓縮等操作,並可以以指定格式保存圖像文件。
既然不能直接通過構造方法創建Bitmap,那怎樣才能創建Bitmap對象。通常我們可以利用Bitmap的靜態方法createBitmap()和BitmapFactory的decode系列靜態方法創建Bitmap對象。
3. Bitmap的顏色配置信息與壓縮方式信息Bitmap中有兩個內部枚舉類:Config和CompressFormat,Config是用來設置顏色配置信息的,CompressFormat是用來設置壓縮方式的。
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操作不僅包含移動操作,還包含別的操作時才適用。其實上面的方法本質上就是調用這個方法而已。
2. Bitmap縮放,旋轉,移動圖像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對象的寬度。
6. 使用Bitmap時防止OOM的有效方法1. 高效壓縮圖片2. 使用緩存常用的緩存有內存緩存LruCache和磁碟緩存DiskLruCache。
Android界面性能調優手冊
https://androidtest.org/android-graphics-performance-pattens/?utm_medium=email&utm_source=gank.io