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

  

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

  

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

  


  

  

那么容易。你所需要做的就是使用BitmapFactory解码你的图片。

        位图的位图=BitmapFactory.decodeResource (getresource (), R.mipmap.hqimage);    imageView.setImageBitmap(位图);      

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

  

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

  

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

  

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


  

  

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

        BitmapFactory。选择选项=new BitmapFactory.Options ();   选项。inJustDecodeBounds=true;   R.mipmap BitmapFactory.decodeResource (getresource ()。hqimage、期权);      

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

  

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

  
  

选项。outHeight: 1126
  选项。outWidth: 2000
  选项。位图:空
  

     


  

  

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

  

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

        BitmapFactory。选择选项=new BitmapFactory.Options ();   选项。inJustDecodeBounds=true;   选项。inSampleSize=3;   R.mipmap BitmapFactory.decodeResource (getresource ()。hqimage、期权);      

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

  

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

        选项。inSampleSize=calculateInSampleSize(选项,500500);   选项。inJustDecodeBounds=false;   位图smallBitmap=BitmapFactory.decodeResource (getresource (), R.mipmap。hqimage、期权);      

我们将inJustDecodeBounds变为false,以便获取位图。

  

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

  

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

  


  

  

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

  

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

        ByteArrayOutputStream bos=new ByteArrayOutputStream ();   bitmap.compress(100年Bitmap.CompressFormat.JPEG bos);   byte [] bitmapdata=https://www.yisu.com/zixun/bos.toByteArray ();      

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

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

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

  

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

  

文件大小由1.6 mb变成啦24.4 kb。

  

翻译自:加载大位图有效地在Android
  

  

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