圖片處理(縮放、壓縮)

項目中用到自定義相機,由於攝像頭都是width > height,並且拍照完了以後的圖片總是需要旋轉90度以後纔是自己想要的結果,問題就出來了因爲拍照以後生成的圖片分辨率太高,旋轉的時候總是OutOfMemoryError。在網上搜索解決辦法的時候有建議:“儘量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,因爲這些函數在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多內存。因此,改用先通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設爲ImageView的 source,decodeStream最大的祕密在於其直接調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。另外,decodeStream直接拿的圖片來讀取字節碼了, 不會根據機器的各種分辨率來自動適應, 使用了decodeStream之後,需要在hdpi和mdpi,ldpi中配置相應的圖片資源, 否則在不同分辨率機器上都是同樣大小(像素點數量),顯示出來的大小就不對了。”對於不能直接使用hdpi或mdpi等的問題,是否可以獲取資源文件的io流以後再調用decodeStream函數傳入io。

還有對內存的分配,可以參考:http://blog.csdn.net/huangbiao86/article/details/8072128

順便記錄一下圖片的一些處理:

按質量壓縮圖片:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 80, baos);//質量壓縮方法,壓縮到80%
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮後的數據baos存放到ByteArrayInputStream中
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數據生成圖片

按比例壓縮圖片:

BitmapFactory.Options newOpts = new BitmapFactory.Options();
        //開始讀入圖片,此時把options.inJustDecodeBounds 設回true了  
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此時返回bm爲空  

        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        //現在主流手機比較多是800*480分辨率,所以高和寬我們設置爲  
        float hh = 800f;//這裏設置高度爲800f  
        float ww = 480f;//這裏設置寬度爲480f  
        //縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可  
        int be = 1;//be=1表示不縮放  
        if (w > h && w > ww) {//如果寬度大的話根據寬度固定大小縮放  
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {//如果高度高的話根據寬度固定大小縮放  
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0)
            be = 1;
        newOpts.inSampleSize = be;//設置縮放比例(採樣率),這裏其實圖片縮放了2be(寬高都縮放了)
        //重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了  
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
X、Y方向上按比例縮放:

Matrix matrix = new Matrix();
        matrix.setScale(0.5f, 0.5f); // x方向和y方向上分別縮放0.5
        Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章