加載并顯示一幅圖像對內(nèi)存使用情況具有顯著的影響。例如,HTC G1電話帶有一個320萬像素的攝像頭。320萬像素的攝像頭通常會捕獲2048×1536像素的圖像。顯示如此大小的32位圖像將需要超過100 663kb或大約13MB的內(nèi)存。雖然我們的應(yīng)用程序不一定會因此而耗盡內(nèi)存,但是這肯定會使得內(nèi)存更加容易耗盡。
Android提供了一個名為BitmapFactory的實用程序類,該程序類提供了一系列的靜態(tài)方法,允許通過各種來源加載Bitmap圖像。針對我們的需求,將從文件加載圖像,并在最初的活動中顯示它。幸運的是,BitmapFactory中的可用方法將會調(diào)用BitmapFactory.Options 類,這使得我們能夠定義如何將Bitmap讀入內(nèi)存。具體而言,當(dāng)加載圖像時,可以設(shè)置BitmapFactory應(yīng)該使用的采樣大小。在BitmapFactory.Options中指定inSampleSize參數(shù),這將表明一旦加載時結(jié)果Bitmap圖像所占的比例。例如,在這里將inSampleSize設(shè)置為8,這會產(chǎn)生一幅大小是原始圖像大小1/8的圖像。
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inSampleSize = 8;
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
imv.setImageBitmap(bmp);
這是一種快速加載大圖像的方法,但是沒有真正考慮圖像的原始大小,也沒有考慮屏幕的大小。最好能夠?qū)D像縮放到剛好適合屏幕。
下面的代碼片段演示了如何使用顯示維度來確定在加載圖像時應(yīng)該發(fā)生的減采樣量。當(dāng)使用這些方法時,應(yīng)確保該圖像盡可能多地填充顯示范圍。但如果該圖像只是要在任何一個維度中顯示100個像素,那么應(yīng)該使用這個值而不是顯示維度,可以通過如下方式獲得該值。
Display currentDisplay = getWindowManager().getDefaultDisplay();
int dw = currentDisplay.getWidth();
int dh = currentDisplay.getHeight();
為了確定圖像的所有尺寸(用于計算),我們使用了BitmapFactory和BitmapFactory. Options,并將BitmapFactory.Options.inJustDecodeBounds變量設(shè)置為true。這將通知BitmapFactory類只須返回該圖像的范圍,而無須嘗試解碼圖像本身。當(dāng)使用此方法時,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);