【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

简介: 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

文章目录

一、 图片压缩

二、 图片文件压缩类型

三、 Android 原生 API 提供的质量压缩

四、 Android 原生 API 提供的尺寸压缩





一、 图片压缩


图片压缩 :



① 文件压缩 : 图片的文件压缩 , 一张图片可以经过压缩 , 占用更少的磁盘或网络空间 ;


② 文件压缩应用场景 :


网络传输图片 : 上传图片至服务器 , 为了 节省占用的带宽资源 , 将图片文件进行压缩 ;

保存图片 : 保存图片到设备的 SD 卡 , 为了 节省磁盘资源 , 将图片文件进行压缩 ;

③ 内存压缩 : 与文件压缩相对应的是内存压缩 , 在 内存中如何使用更少的内存显示出想要显示的图片 ; 在之后的博客中会详细介绍 ;






二、 图片文件压缩类型


图片文件压缩类型 :



① 质量压缩 :


压缩清晰度 : 将图片的清晰度降低 , 一些画面的细节被模糊掉了 , 这些细节尽量不要让肉眼观察出来 ;

有损压缩 : 压缩后有信息损失 , 无法复原 ;

② 尺寸压缩 : 减小图片的尺寸大小 , 明显这个也是有损的 , 无法复原 ;


③ 不同压缩格式的压缩率 : webp > jpeg > png ;


如果图片不需要透明度 ( alpha ) 通道的信息 , 推荐使用 JPEG ;

webp 目前使用还不是很广泛 ;





三、 Android 原生 API 提供的质量压缩


图片质量压缩函数原型 : 下面的函数原型中给出了详细注释 ;



① 函数作用 : 传入压缩参数 , 将压缩的内容输出到文件或网络中 ;


② 参数解析 :


CompressFormat format 参数 : 被压缩的目标格式, 要将该图片压缩成什么格式 JPEG, PNG, WEBP , 压缩格式从下面的枚举类型中获取 ;
    /**
     * Bitmap 位图只能被压缩成以下三种格式
     */
    public enum CompressFormat {
        JPEG    (0),
        PNG     (1),
        WEBP    (2);
        CompressFormat(int nativeInt) {
            this.nativeInt = nativeInt;
        }
        final int nativeInt;
    }


int quality 参数 : 给压缩器的质量, 0-100 ; 0 压缩到极限最小 , 100 压缩时最高质量 , PNG 图片是无损图片格式 , 其质量不能被降低 , 会忽略该参数 ;

OutputStream stream 参数 : 写出被压缩图片的输出流, 可以是文件输出流 , 也可以是网络流 ;

③ 返回值 : 如果压缩成功, 并写出到指令的输出流, 返回 true ;


 

/**
     * 写出该位图压缩后的版本到输出流中
     * 如果该方法返回 true, 该位图可以向 BitmapFactory.decodeStream() 传入对应输入流进行恢复. 
     * 传入的压缩配置并不是所有的格式都接收所有的配置,
     * 从 BitmapFactory 返回的位图极有可能与原图位深度不同,
     * 如果是 JPEG 格式, 其没有透明度通道, 只支持
     *
     * @param format   被压缩的目标格式, 要将该图片压缩成什么格式 JPEG, PNG, WEBP 
     * @param quality  给压缩器的质量, 0-100. 0 压缩到极限最小, 100 压缩时最高质量
     *        PNG 图片是无损图片格式, 其质量不能被降低, 会忽略该参数; 
     * @param stream   写出被压缩图片的输出流, 可以是文件输出流 , 也可以是网络流
     * @return 如果压缩成功, 并写出到指令的输出流, 返回 true
     */
    @WorkerThread
    public boolean compress(CompressFormat format, int quality, OutputStream stream) {
      // 首先检查该图片是否被回收, 如果已经被回收, 直接丢出异常退出
        checkRecycled("Can't compress a recycled bitmap");
        // 调用输出流时会调用 Native 方法, 显示检查该流是否合法
        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");
        // 执行 Native 方法, 压缩图片
        boolean result = nativeCompress(mNativePtr, format.nativeInt,
                quality, stream, new byte[WORKING_COMPRESS_STORAGE]);
        Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
        return result;
    }






四、 Android 原生 API 提供的尺寸压缩


图片尺寸压缩函数原型 : 下面的函数原型中给出了详细注释 ;



① 函数作用 : 创建一个新的 Bitmap 对象 , 缩放一张已存在的位图 ; 如果指定的宽高与当前源位图的宽高一致 , 那么直接将源位图返回 ;


② 参数解析 :


Bitmap src 参数 : 位图原图 ;

int dstWidth 参数 : 图片转换后的目标宽度 ;

int dstHeight 参数 : 图片转换后的目标高度 ;

boolean filter 参数 : 设置缩放图像时是否使用双线性滤波 ; 如果设置成 true , 则使用双线性滤波 , 当缩放时图片质量更好 , 但是会降低性能 ; 如果设置成 false , 使用最近邻法进行尺寸缩放 , 图片质量差 , 但是速度很快 ; 推荐默认设置成 true , 双线性滤波开销很小 , 对于图像质量的改善效果显著 ;

③ 返回值 : 返回新的被缩放好的 Bitmap 位图 , 如果缩放失败 , 返回源图 ;


   /

**
     * 创建一个新的 Bitmap 对象 , 缩放一张已存在的位图 ;
     * 如果指定的宽高与当前源位图的宽高一致 , 那么直接将源位图返回
     *
     * @param src       位图原图
     * @param dstWidth  图片转换后的目标宽度
     * @param dstHeight 图片转换后的目标高度
     * @param filter    设置缩放图像时是否使用双线性滤波. 
     *      如果设置成 true , 则使用双线性滤波 , 
     *      当缩放时图片质量更好 , 但是会降低性能 ; 
     *      如果设置成 false , 使用最近邻法进行尺寸缩放 ,
     *      图片质量差 , 但是速度很快 ;
     *      推荐默认设置成 true , 双线性滤波开销很小 , 对于图像质量的改善效果显著 ;
     * @return 返回新的被缩放好的 Bitmap 位图 , 如果缩放失败 , 返回源图 ;
     * @throws IllegalArgumentException 如果传入的宽高值参数小于等于 0, 抛出异常 ;
     */
    public static Bitmap createScaledBitmap(@NonNull Bitmap src, int dstWidth, int dstHeight,
            boolean filter) {
        Matrix m = new Matrix();
        final int width = src.getWidth();
        final int height = src.getHeight();
        if (width != dstWidth || height != dstHeight) {
            final float sx = dstWidth / (float) width;
            final float sy = dstHeight / (float) height;
            m.setScale(sx, sy);
        }
        /*
          最终调用的是 public static Bitmap createBitmap(
          @NonNull Bitmap source, int x, int y, int width, int height,
            @Nullable Matrix m, boolean filter) 方法 , 后续博客有详细解析
         */
        return Bitmap.createBitmap(src, 0, 0, width, height, m, filter);
    }


目录
相关文章
|
8月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
320 1
|
9月前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
9月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
9月前
|
数据采集 API 数据格式
Python 原生爬虫教程:京东商品详情页面数据API
本文介绍京东商品详情API在电商领域的应用价值及功能。该API通过商品ID获取详细信息,如基本信息、价格、库存、描述和用户评价等,支持HTTP请求(GET/POST),返回JSON或XML格式数据。对于商家优化策略、开发者构建应用(如比价网站)以及消费者快速了解商品均有重要意义。研究此API有助于推动电商业务创新与发展。
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
342 4
Android开发表情emoji功能开发
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
546 3
|
存储 安全 测试技术
如何评估 API 的质量
本文详细介绍了评估API质量的关键指标,包括功能性(功能完整性与准确性)、可靠性(稳定性和错误处理)、性能(响应时间和吞吐量)、易用性(文档质量和接口设计)及安全性(身份验证和数据加密),并提供了具体评估方法与测试建议,帮助开发者全面衡量API质量。通过这些评估,可以确保选择到高质量的API,为软件项目奠定坚实基础。
527 5
|
3月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
3月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
4月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。