Android性能优化之图片压缩综合解决方案

本文探讨了Android中图片压缩的三种方法:质量压缩、尺寸压缩和使用libjpeg库进行压缩。质量压缩通过Bitmap.compress() API实现,尺寸压缩利用BitmapFactory.Options避免内存溢出并计算采样率。libjpeg是一个C语言编写的JPEG编解码库,其turbo版本在某些平台上能提供更快的性能。虽然新版本的Bitmap.compress()内部也可能使用哈夫曼算法,但libjpeg对于兼容低版本和跨平台具有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:拖鞋王子猪
转载地址:https://juejin.cn/post/7087388674735734797

在Android中我们经常会遇到图片压缩的场景,比如给服务端上传图片,包括个人信息的用户头像,有时候人脸识别也需要捕获图片等等。这种情况下,我们都需要对图片做一定的处理,比如大小,尺寸等的压缩。

常见的图片压缩方法
  • 质量压缩
  • 尺寸压缩
  • libjpeg
质量压缩

首先我们要介绍一个api–Bitmap.compress()

@WorkerThread
public boolean compress(CompressFormat format, int quality, OutputStream stream) {
   
   
    checkRecycled("Can't compress a recycled bitmap");
    // do explicit check before calling the native method
    if (stream == null) {
   
   
        throw new NullPointerException();
    }
    if (quality < 0 || quality > 100) {
   
   
        throw new IllegalArgumentException("quality must be 0..100");
    }
    StrictMode.noteSlowCall("Compression of a bitmap is slow");
    Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, "Bitmap.compress");
    boolean result = nativeCompress(mNativePtr, format.nativeInt,
            quality, stream, new byte[WORKING_COMPRESS_STORAGE]);
    Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
    return result;
}

compress()是系统的API,也是质量和尺寸压缩常用的方法。

public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream);这个方法有三个参数:
Bitmap.CompressFormat format图像的压缩格式;
int quality图像压缩率,O-100。0压缩100%,100意味着不压缩;OutputStream stream 写入压缩数据的输出流;
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream);这个方法有三个参数:

  1. Bitmap.CompressFormat format图像的压缩格式;
  2. int quality图像压缩率,O-100。0压缩100%,100意味着不压缩;
  3. OutputStream stream 写入压缩数据的输出流;

返回值:如果成功地把压缩数据写入输出流,则返回true。

伪代码

val baos= ByteArrayoutputstream ()
    try {
   
   
        var quality = 50
        do {
   
   
            quality -= 10
            baos.reset()
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值