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