Android 图片压缩之多种压缩方式结合使用,android开发规范

int resultCode= generateJPEG(tmpdata, w, h, quality, fileName, optimize);

free(tmpdata);

if(resultCode==0){

jstring result=(*env)->NewStringUTF(env, error);

error=NULL;

return result;

}

return (*env)->NewStringUTF(env, “1”); //success

}

compressBitmap()为native关联方法,saveBitmap() 压缩调用方法

private static native String compressBitmap(Bitmap bit, int w, int h, int quality, byte[] fileNameBytes,

boolean optimize);

private static void saveBitmap(Bitmap bmp, int quality, String fileName, boolean optimize) {

compressBitmap(bit, bit.getWidth(), bit.getHeight(), quality, fileName.getBytes(), optimize);

}

4. 结合三种方式的终极压缩


首先通过尺寸压缩,压缩到手机常用的一个分辨率(1280*960 微信好像是压缩到这个分辨率),然后我们要把图片压缩到100KB以内,通过质量压缩来计算options需要设置为多少,最后调用JNI压缩,这边我测试了下,压缩出来的清晰度和原图几乎差不多,压缩时间大概1秒钟左右

public static int getRatioSize(int bitWidth, int bitHeight) {

// 图片最大分辨率

int imageHeight = 1280;

int imageWidth = 960;

// 缩放比

int ratio = 1;

// 缩放比,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

if (bitWidth > bitHeight && bitWidth > imageWidth) {

// 如果图片宽度比高度大,以宽度为基准

ratio = bitWidth / imageWidth;

} else if (bitWidth < bitHeight && bitHeight > imageHeight) {

// 如果图片高度比宽度大,以高度为基准

ratio = bitHeight / imageHeight;

}

// 最小比率为1

if (ratio <= 0)

ratio = 1;

return ratio;

}

public static void compressBitmap(Bitmap image, String filePath) {

// 最大图片大小 100KB

int maxSize = 100;

// 获取尺寸压缩倍数

int ratio = NativeUtil.getRatioSize(image.getWidth(), image.getHeight());

// 压缩Bitmap到对应尺寸

Bitmap result = Bitmap.createBitmap(image.getWidth() / ratio, image.getHeight() / ratio, Config.ARGB_8888);

Canvas canvas = new Canvas(result);

Rect rect = new Rect(0, 0, image.getWidth() / ratio, image.getHeight() / ratio);

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值