Android高效安全加载图片的方法详解

  


  

  

在Android应用程序的设计中,几乎不可避免地都需要加载和显示图片,由于不同的图片在大小上千差万别,有些图片可能只需要几十KB的内存空间,有些图片却需要占用几十MB的内存空间,或者一张图片不需要占用太多的内存,但是需要同时加载和显示多张图片。
  

  

在这些情况下,加载图片都需要占用大量的内存,而Android系统分配给每个进程的内存空间是有限的,如果加载的图片所需要的内存超过了限制,进程就会出现伯父,即内存溢出。
  

  

本文针对加载大图片或者一次加载多张图片等两种不同的场景,采用不同的加载方式,以尽量避免可能导致的内存溢出问题。
  

  

下面话不多说了,来一起看看详细的介绍吧

  


  

  

有时一张图片的加载和显示就需要占用大量的内存,例如图片的大小是2592 x1936,同时采用的位图配置是ARGB_8888,其在内存中需要的大小是2592 x1936x4字节,大概是19 mb。仅仅加载这样一张图片就可能会超过进程的内存限制,进而导致内存溢出,所以在实际使用时肯定无法直接加载到内存中。
  

  

为了避免内存溢出,根据不同的显示需求,采取不同的加载方式:

  
      <李>显示一张图片的全部内容:对原图片进行压缩显示。   <李>显示一张图片的部分内容:对原图片进行局部显示。   
  

<强> 2.1图片压缩显示
  

  

图片的压缩显示指的是对原图片进行长宽的压缩,以减少图片的内存占用,使其能够在应用上正常显示,同时保证在加载和显示过程中不会出现内存溢出的情况。
  

  

BitmapFactory是一个创建位图对象的工具类,使用它可以利用不同来源的数据生成Bitamp对象,在创建过的过程中还可以对需要生成的对象进行不同的配置和控制,BitmapFactory的类声明如下:
  

        创建位图对象从不同的来源,包括文件、流和字节数组。      

由于在加载图片前,是无法提前预知图片大小的,所以在实际加载前必须根据图片的大小和当前进程的内存情况来决定是否需要对图片进行压缩,如果加载原图片所需的内存空间已经超过了进程打算提供或可以提供的内存大小,就必须考虑压缩图片。
  

  

<强> 2.1.1确定原图片长宽
  

  

简单来说,压缩图片就是对原图的长宽按照一定的比例进行缩小,所以首先要确定原图的长宽信息。为了获得图片的长宽信息,利用BitmapFactory.decodeResource(资源res, int id,选项选择)接口,其声明如下:
  

     /* *   *打开给定的资源和调用的同义词   * {@link # decodeResourceStream}。   *   * @param res包含图像数据的资源对象   * @param id的资源id图像数据   * @param选择null-ok;选项控制将采样和是否   *图像应该完全解码,或只是大小返回。   * @return解码位图,或者如果图像数据不能空   *解码,或者,如果选择非空,如果选择要求>/* *   *如果设置为true,译码器将返回null(没有图),但是   * & lt; code>……& lt;/code>领域仍将被设置,允许调用者   *无需分配内存的位图查询的像素。   */公共布尔inJustDecodeBounds;      

下面给出得到图片长宽信息的示例代码:
  

        BitmapFactory。选择选项=new BitmapFactory.Options ();//指定在解析图片文件时,仅仅解析边缘信息而不创建位图对象。   选项。inJustDecodeBounds=true;//R.drawable。测试是使用的2560 x1920的测试图片资源文件。   R.drawable BitmapFactory.decodeResource (getresource ()。测试选项);   int宽度=options.outWidth;   int高度=options.outHeight;   日志。我(标签,“宽度:”+宽度+”,高度:“+高度);      

在实际测试中,得到的长宽信息如下:
  

  
  

,,,01-05 04:06:23.022 29836 29836我Android_Test:宽度:2560年,身高:1920
  

     

<强> 2.1.2确定目标压缩比例
  

  

得知原图片的长宽信息后,为了能够进行后续的压缩操作,必须要先确定目标压缩比例。所谓压缩比例就是指要对原始的长宽进行的裁剪比例,如果如果原图片是2560 x1920采取的压缩比例是4,进行压缩后的图片是640 x480,最终大小是原图片的1/16。
  

  

Android高效安全加载图片的方法详解