圖片的終極壓縮和保存

手頭上的功能爲多圖選擇後上傳所選圖片,由於目前手機上的照片文件都比較大,對照片質量沒有太高的要求,所以進行圖片的壓縮上傳。

首先根據原圖的地址生成壓縮後的圖片,首先進行圖片的尺寸壓縮,然後進行圖片的質量壓縮。代碼如下。

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;}



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