標籤:
說到圖片,第一反映就是bitmap,那就先來認識一下bitmap
Bitmap是Android系統中的影像處理的最重要類之一。用它可以擷取影像檔資訊,進行映像剪下、旋轉、縮放等操作,並可以指定格式儲存影像檔
Bitmap實現在android.graphics包中。但是Bitmap類的建構函式是私人的,外面並不能執行個體化,只能是通過JNI執行個體化。這必然是 某個輔助類提供了建立Bitmap的介面,而這個類的實現通過JNI介面來執行個體化Bitmap的,這個類就是BitmapFactory
方法比較多,我們暫時只考慮比較常用的幾個,其餘的看一下源碼的註解就知道
- decodeResource
- decodeFile
- decodeStream
解碼資源,解碼檔案,解碼流,根據它的名字就知道了所要載入的資源,例如sd卡的檔案解碼可是使用decodeFile方法,網路上的圖片可以使用decodeStream方法,資源檔中的圖片可以使用decodeResource方法,當然這個不是固定唯一的,因為前面兩個方法都是通過對第三個方法的封裝實現的
為了防止圖片OOM,它還提供了Options這個參數
- inJustDecodeBounds
- inSampleSize
- outWidth
- outHeight
- inPreferredConfig
- outMimeType
…
如果inJustDecodeBounds設定為true,允許查詢位元影像,但是不分配記憶體傳回值為null,但是可以讀取圖片的尺寸和類型資訊。
inSampleSize的值在解析圖片為Bitmap時在長寬兩個方向上像素縮小的倍數,預設值和最小值為1(當小於1時,按照1處理),且在大於1時,該值只能為2的冪(當不為2的冪時,解碼器會取與該值最接近的2的冪)
inPreferredConfig預設為ARGB_8888,當然也可以賦其他值,例如:ALPHA_8, RGB_565, ARGB_4444,四種像素類型,每個像素佔用所佔的位元組數不同
下面來實現圖片的變換
縮小:
public void scalePic(int reqWidth,int reqHeight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options); options.inSampleSize = PhotoUtil.calculateInSampleSize(options, reqWidth,reqHeight); options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.demo, options); postInvalidate(); }
public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; }
主要使用通過屬性inSampleSize實現圖片縮小,當然這個方法不是為了實現縮放的,我們這裡只是說明一下,它的主要目的還是預防OOM,當載入一張圖片時,當對於圖片的大小不確定時,要做一下限制,以防出現OOM,下面給出真正放大,縮小的代碼
public void scalePicByMatrix(float scaleWidth, float scaleHeight){ Matrix matrix = new Matrix(); matrix.setScale(scaleWidth,scaleHeight); bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,false); postInvalidate(); }
旋轉:
public void rotatePic(int angle) { Matrix matrix = new Matrix(); matrix.setRotate(angle); bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,false); postInvalidate(); }
剪裁:
public void cutPic(int reqWidth, int reqHeight) { if (bitmap.getWidth() > reqWidth && bitmap.getHeight() > reqHeight) { bitmap = Bitmap.createBitmap(bitmap, 0, 0, reqWidth, reqHeight); }else { bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight()); } postInvalidate(); }
以上給出的只是其中的一種方法,具體操作看應用情境
Android 之 圖片變換