下载后可任意编辑高效加载大图片我们在编写 Android 程序的时候常常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多。大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现 OOM(OutOfMemory)异常。我们可以通过下面的代码看出每个应用程序最高可用内存是多少。[java ]view plaincopyint maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);Log.d("TAG", "Max memory is " + maxMemory + "KB");因此在展示高分辨率图片的时候,最好先将图片进行压缩。压缩后的图片大小应该和用来展示它的控件大小相近,在一个很小的 ImageView 上显示一张超大的图片不会带来任何视觉上的好处,但却会占用我们相当多宝贵的内存,而且在性能上还可能会带来负面影响。下面我们就来看一看,如何对一张大图片进行适当的压缩,让它能够以最佳大小显示的同时,还能防止 OOM 的出现。BitmapFactory 这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource 等)用于创建 Bitmap 对象,我们应该根据图片的来源选择合适的方法。比如 SD 卡中的图片可以使用 decodeFile 方法,网络上的图片可以使用 decodeStream 方法,资源文件中的图片可以使用 decodeResource 方法。这些方法会尝试为已经构建的 bitmap 分配内存,这时就会很容易导致 OOM 出现。为此每一种解析方法都提供了一个可选的 BitmapFactory.Options 参数,将这个参数的inJustDecodeBounds 属性设置为 true 就可以让解析方法禁止为 bitmap 分配内存,返回值也不再是一个 Bitmap 对象,而是 null。虽然 Bitmap 是 null 了,但是BitmapFactory.Options 的 outWidth、outHeight 和 outMimeType 属性都会被赋值。这个技巧让我们可以在加载图片之前就猎取到图片的长宽值和 MIME 类型,从而根据情况对图片进行压缩。如下代码所示:[java]view plaincopyBitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource(getResources(), R.id.myimage, options);int imageHeight = options.outHeight;int imageWidth = options.outW...