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>