加载并显示一幅图像对内存使用情况具有显著的影响。例如,HTC G1电话带有一个320万像素的摄像头。320万像素的摄像头通常会捕获2048×1536像素的图像。显示如此大小的32位图像将需要超过100 663kb或大约13MB的内存。虽然我们的应用程序不一定会因此而耗尽内存,但是这肯定会使得内存更加容易耗尽。
Android提供了一个名为BitmapFactory的实用程序类,该程序类提供了一系列的静态方法,允许通过各种来源加载Bitmap图像。针对我们的需求,将从文件加载图像,并在最初的活动中显示它。幸运的是,BitmapFactory中的可用方法将会调用BitmapFactory.Options 类,这使得我们能够定义如何将Bitmap读入内存。具体而言,当加载图像时,可以设置BitmapFactory应该使用的采样大小。在BitmapFactory.Options中指定inSampleSize参数,这将表明一旦加载时结果Bitmap图像所占的比例。例如,在这里将inSampleSize设置为8,这会产生一幅大小是原始图像大小1/8的图像。
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inSampleSize = 8;
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
imv.setImageBitmap(bmp);
这是一种快速加载大图像的方法,但是没有真正考虑图像的原始大小,也没有考虑屏幕的大小。最好能够将图像缩放到刚好适合屏幕。
下面的代码片段演示了如何使用显示维度来确定在加载图像时应该发生的减采样量。当使用这些方法时,应确保该图像尽可能多地填充显示范围。但如果该图像只是要在任何一个维度中显示100个像素,那么应该使用这个值而不是显示维度,可以通过如下方式获得该值。
Display currentDisplay = getWindowManager().getDefaultDisplay();
int dw = currentDisplay.getWidth();
int dh = currentDisplay.getHeight();
为了确定图像的所有尺寸(用于计算),我们使用了BitmapFactory和BitmapFactory. Options,并将BitmapFactory.Options.inJustDecodeBounds变量设置为true。这将通知BitmapFactory类只须返回该图像的范围,而无须尝试解码图像本身。当使用此方法时,BitmapFactory. Options.outHeight和BitmapFactory.Options.outWidth变量将会被赋值。
// 加载图像的尺寸而不是图像本身
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);
int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);
Log.v("HEIGHTRATIO",""+heightRatio);
Log.v("WIDTHRATIO",""+widthRatio);