博客
关于我
Android 多张2K,4k图片加载压缩的详解
阅读量:708 次
发布时间:2019-03-21

本文共 3268 字,大约阅读时间需要 10 分钟。

Android图片加载优化方法与实现

在Android开发过程中,频繁加载高分辨率图片可能导致内存不足(OOM),这时候就需要通过图片压缩和优化来解决问题。本文将详细介绍Android中获取图片资源的优化方法,帮助开发者避免内存溢出问题。

图片资源优化方法

在Android中获取图片资源有两种主要方式:从应用程序的资源文件(通过Resources类)或者外部存储(如sdcard)读取图片文件。针对这两种方式,我们将分别介绍图片优化加载的实现方法。

通过Resources获取图片资源

为了高效加载图片资源,Android提供了BitmapFactory类。如果直接用BitmapFactory.decodeResource方法加载图片,可能会因为图片分辨率过高导致内存不足。因此,我们需要对图片进行比例削减,同时保留足够的细节来显示图片。

整体思路如下:

  • 获取图片尺寸:首先,我们需要获取图片资源的宽度和高度。
  • 计算样本比例:根据目标显示宽高,计算图片最优比例。
  • 削减图片大小:根据计算出的比例,将图片大小削减为适当的大小。
  • 具体实现步骤如下:

  • 获取图片尺寸:使用BitmapFactory.Options类设置inJustDecodeBounds属性,首先解析图片,并获取原始尺寸。注意,这一步不需要将图片全部加载入内存,只是获取原始尺寸即可。

  • 计算样本比例:计算原始图片宽高与目标显示宽高的比率,取最小的比率作为画面的样本比例。这样得到的样本比例可以确保图片在显示时不缺失重要细节。

  • 削减图片大小:使用计算出的样本比例,将图片的尺寸缩放至适当大小。需要注意的是,在进行比例削减时,保持图片质量的同时也要兼顾加载速度。

  • 通过sdcard获取图片文件

    外部存储(如sdcard)存储的图片文件同样需要进行优化处理。加载图片文件时也需要考虑文件路径、图片大小和分辨率等因素。

    完整的处理流程如下:

  • 解析图片文件:使用BitmapFactory.decodeFile方法解析图片文件。同样地,如果只需要获取图片尺寸,可以先设置inJustDecodeBounds为true。
  • 获取原始尺寸:解析图片后获取原始宽度和高度,为后续比例计算做准备。
  • 计算样本比例:同上,计算样本比例以确定图片的最优显示尺寸。
  • 加载缩放后的图片:使用计算出的样本比例将图片缩放至适当尺寸,避免加载过大图片导致的内存不足问题。
  • 比例计算方法说明

    幅度削减的关键在于合理选择inSampleSize。以下是详细的计算方法:

    在 calculateInSampleSize 函数中:

  • 获取原始尺寸:获取图片资源的原始宽度和高度。
  • 计算宽高比率:分别计算原始宽度与目标宽度的比率,原始高度与目标高度的比率。
  • 选择最小比率:如果有比率更小,则采用该比率作为样本尺寸。如果两个比率相同,取其中一个。
  • 代码示例:

    public int calculateInSampleSize(        BitmapFactory.Options options, int reqWidth, int reqHeight) {    final int height = options.outHeight;    final int width = options.outWidth;    int inSampleSize = 1;    if (height > reqHeight || width > reqWidth) {        final int heightRatio = Math.round((float) height / (float) reqHeight);        final int widthRatio = Math.round((float) width / (float) reqWidth);        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;    }    return inSampleSize;}

    代码实现

    基于上述方法,完整的优化加载图片的实现代码如下:

    public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,        int reqWidth, int reqHeight) {    final BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    BitmapFactory.decodeResource(res, resId, options);    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);    options.inJustDecodeBounds = false;    return BitmapFactory.decodeResource(res, resId, options);}public static Bitmap decodeSampledBitmapFromSdcard(String filepath, int reqWidth,        int reqHeight) {    final BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    BitmapFactory.decodeFile(filepath, options);    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);    options.inJustDecodeBounds = false;    return BitmapFactory.decodeFile(filepath, options);}public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth,        int reqHeight) {    final int height = options.outHeight;    final int width = options.outWidth;    int inSampleSize = 1;    if (height > reqHeight || width > reqWidth) {        final int heightRatio = Math.round((float) height / (float) reqHeight);        final int widthRatio = Math.round((float) width / (float) reqWidth);        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;    }    return inSampleSize;}

    通过以上方法,可以有效地对图片进行降采样,避免重复计算资源,并显著减少内存占用。在实际开发中,可以根据具体需求调整样本比例,以平衡图片质量和加载速度。

    通过合理使用这些优化方法,可以有效避免OOM问题,并提升应用的启动速度和性能表现。

    转载地址:http://mqgez.baihongyu.com/

    你可能感兴趣的文章
    Metasploit Web服务器渗透测试实战
    查看>>
    Moment.js常见用法总结
    查看>>
    MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    ms sql server 2008 sp2更新异常
    查看>>
    MS UC 2013-0-Prepare Tool
    查看>>
    msbuild发布web应用程序
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    MyEclipse配置SVN
    查看>>