Android非同期一括圧縮画像

4836 ワード

最近少し暇になって、それから前のプロジェクトで使ったものを整理し始めて、後でプロジェクトを再利用するのに便利です.多くのプロジェクトでは、画像を公開する機能が必要でしょう.コミュニティのモーメンツのように、画像を圧縮してアップロードしないと、体験が悪くなります.最初の無駄なトラフィック、2番目の待ち時間が長すぎます.だからアップロードする前にやはり写真を圧縮してみましょう.ここで圧縮はサイズと品質を圧縮して、圧縮した写真は100 kぐらいです.解像度が保証され、体積も大幅に減少します.
くだらないことは言わないで、直接使い方を見てみましょう.
List list = new ArrayList<>();
        list.add("mnt/sdcard/1.jpg");
        list.add("mnt/sdcard/2.jpg");
        list.add("mnt/sdcard/3.jpg");
        new CompressPhotoUtils().CompressPhoto(MainActivity.this, list, new CompressCallBack() {

            @Override
            public void success(List list) {
                //upload(list);       
            }
        });

簡単なのではないでしょうか.メソッドを呼び出すと、非同期タスクを使って画像を圧縮します.コールバックのリスト集合は圧縮された写真パス集合で、ここでアップロードのメソッドを呼び出せばいいです.最後にコードを添付します.
package com.example.lol;

import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

public class CompressPhotoUtils {

    private List fileList = new ArrayList<>();
    private ProgressDialog progressDialog;

    public void CompressPhoto(Context context, List list, CompressCallBack callBack) {
        CompressTask task = new CompressTask(context, list, callBack);
        task.execute();
    }

    class CompressTask extends AsyncTask {
        private Context context;
        private List list;
        private CompressCallBack callBack;

        CompressTask(Context context, List list, CompressCallBack callBack) {
            this.context = context;
            this.list = list;
            this.callBack = callBack;
        }

        /**
         *    UI   ,   doInBackground()    
         */
        @Override
        protected void onPreExecute() {
            progressDialog = ProgressDialog.show(context, null, "   ...");
        }

        /**
         *        ,     UI  ,         
         */
        @Override
        protected Integer doInBackground(Void... params) {
            for (int i = 0; i < list.size(); i++) {
                Bitmap bitmap = getBitmap(list.get(i));
                String path = SaveBitmap(bitmap, i);
                fileList.add(path);
            }
            return null;
        }

        /**
         *    ui   , doInBackground()       
         */
        @Override
        protected void onPostExecute(Integer integer) {
            progressDialog.dismiss();
            callBack.success(fileList);
        }

        /**
         *  publishProgress()       ,publishProgress()      
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
        }
    }

    /**
     *  sd       bitmap
     */
    public static Bitmap getBitmap(String srcPath) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        newOpts.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        float hh = 1280f;
        float ww = 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);
        }
        newOpts.inSampleSize = be;//       
        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        return bitmap;
    }

    /**
     *   bitmap    
     */
    public static String SaveBitmap(Bitmap bmp, int num) {
        File file = new File("mnt/sdcard/   /");
        String path = null;
        if (!file.exists())
            file.mkdirs();
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String picName = formatter.format(new Date());
            path = file.getPath() + "/" + picName + "-" + num + ".jpg";
            FileOutputStream fileOutputStream = new FileOutputStream(path);
            bmp.compress(Bitmap.CompressFormat.JPEG, 90, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return path;
    }

    public interface CompressCallBack {
        void success(List list);
    }

}