Android圖片壓縮類

nnkde 11年前發布 | 3K 次閱讀 Java Android

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.Base64;

public class ImageUtils {

//質量壓縮
public static Bitmap compressImage(Bitmap image, int size) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質量壓縮方法,這里100表示不壓縮,把壓縮后的數據存放到baos中
    int options = 100;
    while ( baos.toByteArray().length / 1024>50) {   //循環判斷如果壓縮后圖片是否大于50kb,大于繼續壓縮       
        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;
}

//圖片按比例大小壓縮方法
public static Bitmap getImageFromPath(String srcPath, int size, float width) {
    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
    //縮放比。由于是固定比例縮放,只用高或者寬其中一個數據進行計算即可
    int be = 1;//be=1表示不縮放
    if (w > width) {//如果寬度大的話根據寬度固定大小縮放
        be = (int) (newOpts.outWidth / width);
    }

// 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, size);//壓縮好比例大小后再進行質量壓縮 }

//圖片按比例大小壓縮方法
public static Bitmap compBitmap(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 = 150f;//這里設置寬度為480f
    //縮放比。由于是固定比例縮放,只用高或者寬其中一個數據進行計算即可
    int be = 1;//be=1表示不縮放
    if (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, 50);//壓縮好比例大小后再進行質量壓縮 }

//圖片按比例大小壓縮方法
public static Bitmap compBitmap(InputStream inputStream, int size, float width) {
    BitmapFactory.Options newOpts = new BitmapFactory.Options();
    //開始讀入圖片,此時把options.inJustDecodeBounds 設回true了
    newOpts.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, newOpts);
    newOpts.inJustDecodeBounds = false;
    int w = newOpts.outWidth;
    int h = newOpts.outHeight;
    //現在主流手機比較多是800*480分辨率,所以高和寬我們設置為
    float hh = 800f;//這里設置高度為800f

// float ww = 150f;//這里設置寬度為480f //縮放比。由于是固定比例縮放,只用高或者寬其中一個數據進行計算即可 int be = 1;//be=1表示不縮放 if (w > width) {//如果寬度大的話根據寬度固定大小縮放 be = (int) (newOpts.outWidth / width); } // else if (w < h && h > hh) {//如果高度高的話根據寬度固定大小縮放 // be = (int) (newOpts.outHeight / hh); // } if (be <= 0) be = 1; newOpts.inSampleSize = be;//設置縮放比例 //重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了 bitmap = BitmapFactory.decodeStream(inputStream, null, newOpts); return compressImage(bitmap, size);//壓縮好比例大小后再進行質量壓縮 }

 // 把Bitmap轉換成Base64
public static String getBitmapStrBase64(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] bytes = baos.toByteArray();
        return Base64.encodeToString(bytes, 0);
}

// 把Base64轉換成Bitmap
public static Bitmap getBitmapFromBase64(String iconBase64) {
        byte[] bitmapArray = Base64.decode(iconBase64,  Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
}

public static Drawable convertBitmap2Drawable(Bitmap bitmap) {
    BitmapDrawable bd = new BitmapDrawable(bitmap);
    // 因為BtimapDrawable是Drawable的子類,最終直接使用bd對象即可。
    return bd;
}

}</pre>

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