Android之高效加载大图的方法示例

 更新时间:2019年03月09日 08:29:58   作者:塞上牧羊空许约  
这篇文章主要介绍了Android之高效加载大图的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

加载大图到内存是一件令人头疼的事情。因为大图的原因,我们会在Crash报告中看到OOM(内存不足).Android的内存有限,这一点我们应该心里有数。

stackoverflow上有许多相关问题的回答,当你碰到oom时,可以直接跳过本文,粘贴复制答案即可。但是对于其他人来说,我想告诉你们一些加载大图的知识和原理。

加载Bitmap到内存

so easy.你所需要做的就是使用BitmapFactory解码你的图片。

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage);
imageView.setImageBitmap(bitmap);

看起来好像完事啦么?我要告诉你这里有个问题。让我们来看看解码后的图片占用的内存大小。

bitmap.getByteCount()可以返回图片的大小。其内存大小为 12262248 字节,等于 12.3MB .没错,你可能会有些疑惑。图片在磁盘上的大小为 3.5MB ,getByteCount()得出的结果却大于3.5MB。原因如下:

图片以JPG,PNG或者其他格式压缩后存储在计算机上。一旦你将图片加载到内存后,图片将不会呗压缩,而是占用所有像素所需的内存。

步骤

  • 不用加载图片到内存获取其尺寸
  • 通过图片尺寸计算缩放系数
  • 通过计算后值加载图片到内存

BitmapFactory.Options

这个类是个元数据提供器,我们可以通过这个类来完成第一步。

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);

我们传BitmapFactory.Options实例到BitmapFactory.decodeSource() 方法。我们将 inJustDecodeBounds 设置为 true .inJustDecodeBounds是什么意思呢?就是我们不用讲图片加载到内存中。我们只想得到关于图片的信息。我们可以通过这个信息计算缩放系数。

运行此段代码得到如下信息:

options.outHeight : 1126
options.outWidth : 2000
options.bitmap : null

减少图片大小(内存中)

现在该计算 inSampleSize 啦,等等,何为inSampleSize?inSampleSize是属于 BitmapFactory.Option这个类的一个缩放系数。

如果我们有一张1000 1000的图片,inSampleSize为2,解码后大小为500 500.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 3; 
BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);

我们可以这样玩么?不行。因为我们不知道图片大小,如果是小图,图片将会变得更小,我们的用户只能看到一些像素而不是图片。有些图片将会缩放5倍,有些则为2倍。我们将缩放系数定义为一个常数。所以我们需要根据图片尺寸来计算。

计算inSampleSize的方法取决于你,我的意思就是根据你的需要来设计自己的算法。Android官方文档中,是基于2的幂次方来计算inSampleSize的。

options.inSampleSize = calculateInSampleSize(options, 500,500);
options.inJustDecodeBounds = false;
Bitmap smallBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.hqimage, options);

我们将inJustDecodeBounds变为false,以便获取bitmap.

现在,bitmap.getByteCount() 返回的大小为3.1MB。这个是内存大小。

图片的内存大小由12.3MB变为3.1MB,内存大小减少啦75%。

减少图片尺寸(磁盘上)

我们也可以减少图片在磁盘上的大小。我们可以通过Bitmap的compress方法来压缩图片。

让我们来看下不改边图片质量的尺寸大小,100表示质量不变

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
byte[] bitmapdata = bos.toByteArray();

原图尺寸为1.6MB,改变图片质量后文件大小将发生何种变化?

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bos);

图片质量改为50,大小变成24.4KB

如果你想改变bitmap的质量,压缩格式必须为.JPEG ,PNG格式的图片质量是不会发生变化的。

文件大小由1.6MB变成啦24.4KB。

翻译自: Loading Large Bitmaps Efficiently in Android

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Kotlin如何直接使用控件ID原理详析

    Kotlin如何直接使用控件ID原理详析

    这篇文章主要给大家介绍了关于Kotlin如何直接使用控件ID原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Android App中的GridView网格布局使用指南

    Android App中的GridView网格布局使用指南

    GridView布局所实现的就是类似于九宫格的矩阵界面效果,下面整理了Android App中的GridView网格布局使用指南,包括分割线的添加与自定义GridView的实现等技巧,需要的朋友可以参考下
    2016-06-06
  • Android中FileProvider的各种场景应用详解

    Android中FileProvider的各种场景应用详解

    这篇文章主要为大家介绍了Android中FileProvider的各种场景应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Android仿正点闹钟时间齿轮滑动效果

    Android仿正点闹钟时间齿轮滑动效果

    这篇文章主要为大家详细介绍了Android仿正点闹钟时间齿轮滑动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • android侧滑菜单控件DrawerLayout使用方法详解

    android侧滑菜单控件DrawerLayout使用方法详解

    这篇文章主要为大家详细介绍了android侧滑菜单控件DrawerLayout的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android多套环境的维护思路详解

    Android多套环境的维护思路详解

    这篇文章主要为大家介绍了Android多套环境的维护思路详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android Loader详细介绍及实例代码

    Android Loader详细介绍及实例代码

    这篇文章主要介绍了Android Loader详细介绍及实例代码的相关资料,需要的朋友可以参考下
    2016-12-12
  • Android WebView如何判定网页加载的错误

    Android WebView如何判定网页加载的错误

    这篇文章主要介绍了Android WebView如何判定网页加载的错误,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • Android 侧滑按钮的实现代码

    Android 侧滑按钮的实现代码

    这篇文章主要介绍了Android 侧滑按钮的实现,本文结合示例代码图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Android端权限隐私的合规化处理实战记录

    Android端权限隐私的合规化处理实战记录

    大家应该都发现了,现在很多应用市场都要求应用上架需要用户协议,这篇文章主要给大家介绍了关于Android端权限隐私合规化处理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08

最新评论