Android圖片壓縮

jopen 8年前發布 | 7K 次閱讀 Android開發 移動開發

Android 項目中通常也有2種壓縮方式


Android中圖片有四種屬性,分別是:
ALPHA_8:每個像素占用1byte內存
ARGB_4444:每個像素占用2byte內存
ARGB_8888:每個像素占用4byte內存 (默認)
RGB_565:每個像素占用2byte內存
Android默認的顏色模式為ARGB_8888,這個顏色模式色彩最細膩,顯示質量最高。但同樣的,占用的內存也最大。 所以在對圖片效果不是特別高的情況下使用RGB_565(565沒有透明度屬性)


通常bitmap打水印方式壓縮如下

public Bitmap createBitmapThumbnail(Bitmap bitMap) {  
    int width = bitMap.getWidth();  
    int height = bitMap.getHeight();  
    // 設置想要的大小  
    int newWidth = 99;  
    int newHeight = 99;  
    // 計算縮放比例  
    float scaleWidth = ((float) newWidth) / width;  
    float scaleHeight = ((float) newHeight) / height;  
    // 取得想要縮放的matrix參數  
    Matrix matrix = new Matrix();  
    matrix.postScale(scaleWidth, scaleHeight);  
    // 得到新的圖片  
    Bitmap newBitMap = Bitmap.createBitmap(bitMap, 0, 0, width, height,  
            matrix, true);  
    return newBitMap;  
}


1.大小壓縮

private Bitmap getimage(String srcPath) {  
        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;//設置縮放比例  
        //重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了  
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);  
        return compressImage(bitmap);//壓縮好比例大小后再進行質量壓縮  
    }

2.質量壓縮

private Bitmap compressImage(Bitmap image) {  
  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質量壓縮方法,這里100表示不壓縮,把壓縮后的數據存放到baos中  
        int options = 100;  
        while ( baos.toByteArray().length / 1024>100) {  //循環判斷如果壓縮后圖片是否大于100kb,大于繼續壓縮         
            baos.reset();//重置baos即清空baos  
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里壓縮options%,把壓縮后的數據存放到baos中  
            options -= 10;//每次都減少10  
        }  
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮后的數據baos存放到ByteArrayInputStream中  
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream數據生成圖片  
        return bitmap;  
    }

3.混合方式壓縮

private Bitmap comp(Bitmap image) {  
      
    ByteArrayOutputStream baos = new ByteArrayOutputStream();         
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
    if( baos.toByteArray().length / 1024>1024) {//判斷如果圖片大于1M,進行壓縮避免在生成圖片(BitmapFactory.decodeStream)時溢出    
        baos.reset();//重置baos即清空baos  
        image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//這里壓縮50%,把壓縮后的數據存放到baos中  
    }  
    ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());  
    BitmapFactory.Options newOpts = new BitmapFactory.Options();  
    //開始讀入圖片,此時把options.inJustDecodeBounds 設回true了  
    newOpts.inJustDecodeBounds = true;  
    Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    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;//設置縮放比例  
    //重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了  
    isBm = new ByteArrayInputStream(baos.toByteArray());  
    bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);  
    return compressImage(bitmap);//壓縮好比例大小后再進行質量壓縮  
}


來自: http://my.oschina.net/ososchina/blog/495861

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!