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