canvas.drawBitmap(image, null, rect, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
int options = 100;
result.compress(Bitmap.CompressFormat.JPEG, options, baos);
// 循环判断如果压缩后图片是否大于100kb,大于继续压缩
while (baos.toByteArray().length / 1024 > maxSize) {
// 重置baos即清空baos
baos.reset();
// 每次都减少10
options -= 10;
// 这里压缩options%,把压缩后的数据存放到baos中
result.compress(Bitmap.CompressFormat.JPEG, options, baos);
}
// JNI调用保存图片到SD卡 这个关键
NativeUtil.saveBitmap(result, options, filePath, true);
// 释放Bitmap
if (result != null && !result.isRecycled()) {
result.recycle();
result = null;
}
}
五. NativeUtil类的源码
16.9.29更新
1、添加getBitmapFromFile()方法,解决OOM和图片旋转的问题
2、添加compressBitmap()方法,传递当前图片本地路径和解压后图片保存路径两个参数,即可,实现压缩
package net.bither.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.media.ExifInterface;
/**
-
JNI图片压缩工具类
-
@Description TODO
-
@Package net.bither.util
-
@Class NativeUtil
-
@Copyright: Copyright © 2015
-
@version V1.0.0
*/
public class NativeUtil {
private static int DEFAULT_QUALITY = 95;
/**
-
@Description: JNI基本压缩
-
@param bit
-
bitmap对象
-
@param fileName
-
指定保存目录名
-
@param optimize
-
是否采用哈弗曼表数据计算 品质相差5-10倍 <