Android大图压缩心得

·  阅读 326

原创不易,转发请注明出处。

在拍照上传或相册选择图片上传时,需要将选择的图片进行压缩,如果不压缩,就可能出现内存溢出的
情况,导致程序崩溃。

在我的一个上线的项目中,经过实践,我总结出一套方便可用的压缩方法,在这套方法中,用到了一个开源
的工具:com.blankj:utilcode:1.7.1。

具体实践步骤如下:

1:按比例压缩

首先,根据图片的地址获取到file文件,然后将file文件对象传入ImageUtils.getBitmap()方法中获取

到bitmap,通过bitmap的getHeight()和getWidth()可以获取到图片的原始宽高。根据实践得知,将图

片的宽度设置为800的时候,图片可以压缩的程度和压缩后的清晰度为最好,因此将压缩后图片的宽度

设置为800,然后根据原始宽高获取到压缩后图片的高度。此时就可以调用

ImageUtils.compressByScale()方法,传入参数,就可以获取到压缩后的图片的bitmap对象。

ImageUtils.compressByScale()方法其实就是调用了Bitmap的createScaledBitmap()方法,将原始的

bitmap对象进行了按比例压缩。

2:将按比例压缩后的bitmap对象进行质量压缩

首先根据最后图片要保存到的路径和要保存的文件名创建一个文件对象,然后用BufferedOutputStream
将进行质量压缩后的图片保存到这个文件中。调用第一步中按比例压缩后的bitmap对象的compress()方
法进行压缩,format的格式为Bitmap.CompressFormat.JPEG,质量压缩为80%。

-------------------------------------------------总结好的工具类---------------------------------

import android.graphics.Bitmap;
import android.os.SystemClock;
import android.util.Log;

import com.blankj.utilcode.util.ImageUtils;
import com.blankj.utilcode.util.LogUtils;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

/**

  • Created by Administrator on 2017/8/4.
    */

public class FileUtils {
public static File getPic(String path) {
File file = null;
try {
Bitmap bitmap = ImageUtils.getBitmap(new File(path));
//获取原始宽高
int height = bitmap.getHeight();
LogUtils.e("原图height:" + height);
int width = bitmap.getWidth();
LogUtils.e("原图width:" + width);
//获取新宽高
int newWidth = 1024;
int newHeight = 1024 * height / width;
LogUtils.e("新图newHeight:" + newHeight);
Bitmap bitmap1 = ImageUtils.compressByScale(bitmap, newWidth, newHeight);
file = saveFile(bitmap1);
} catch (Exception e) {
e.printStackTrace();
}
return file;
}

public static File saveFile(Bitmap bm) {
    String path = OConstants.CACHES_DIR;
    File dirFile = new File(path);
    String fileName = SystemClock.currentThreadTimeMillis() + ".png";
    LogUtils.e(fileName);
    if (!dirFile.exists()) {
        dirFile.mkdir();
    }
    File myCaptureFile = new File(path + fileName);
    BufferedOutputStream bos = null;
    try {
        bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));
        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
        bos.flush();
        bos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    LogUtils.e("test111", "myCaptureFile:" + myCaptureFile.length());
    return myCaptureFile;
}复制代码

}

收藏成功!
已添加到「」, 点击更改