圖片的終極壓縮和儲存
阿新 • • 發佈:2019-02-06
手頭上的功能為多圖選擇後上傳所選圖片,由於目前手機上的照片檔案都比較大,對照片質量沒有太高的要求,所以進行圖片的壓縮上傳。
首先根據原圖的地址生成壓縮後的圖片,首先進行圖片的尺寸壓縮,然後進行圖片的質量壓縮。程式碼如下。
public class YaSuoImageUtil {
public static String path = Environment.getExternalStorageDirectory().getPath() + "/" + "mssimgs";
private static YaSuoImageUtil mInstancse;
public static YaSuoImageUtil getInstance() {
if (mInstancse == null) {
mInstancse = new YaSuoImageUtil();
}
return mInstancse;
}
public String YaSuoImg(String strs) {
Bitmap bit = getimage(strs);//獲取bitmap
String path = saveMyBitmap(strs, bit); //儲存圖片返回地址
bit.recycle();
return path;
}
public String saveMyBitmap(String str, Bitmap bit) {
File dir = new File(path);
if (!dir.exists()) {
dir.mkdir();
}
String fpath = dir.getAbsolutePath() + "/" + str.substring(str.lastIndexOf("/"));
File f = new File(fpath);
try {
FileOutputStream fOut = null;
fOut = new FileOutputStream(f);
if (fpath.contains(".jpg")) { //分類儲存圖片
bit.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
} else if (fpath.contains(".png")) {
bit.compress(Bitmap.CompressFormat.PNG, 100, fOut);
}
fOut.flush();
fOut.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
f = null;
e1.printStackTrace();
}
return f.getAbsolutePath();
}
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;
//現在主流手機比較多是1280*720解析度,所以高和寬我們設定為
float hh = 1280f;//這裡設定高度為1280f
float ww = 720f;//這裡設定寬度為720f
//縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
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);//壓縮好比例大小後再進行質量壓縮
}
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 > 200) { //迴圈判斷如果壓縮後圖片是否大於200kb,大於繼續壓縮
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, options, baos);//這裡壓縮options%,把壓縮後的資料存放到baos中
options -= 10;//每次都減少10
}
Log.i("aaaaaaaaaaa", baos.toByteArray().length + "");
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把壓縮後的資料baos存放到ByteArrayInputStream中
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream資料生成圖片
return bitmap;}