2013-03-10 102 views
7

我正在製作Android應用程序,我需要在cavas中加載圖像(位圖),並使用「縮放縮放」手勢調整它的大小。但是,當圖像超過一定大小時,應用程序會崩潰(OutOfMemory異常)。如何優化圖像的加載和操作?Android加載的大位圖

要加載我使用的圖像:

BitmapFactory.decodeResource (ctx.getResources(), R.drawable.image) 

要繪製它:

imgCanvas.drawBitmap (image, posX, posY, null), 

要改變它的大小:

Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true); 

回答

3

這是不平凡的。

基於圖像的當前規模和圖像的當前可見的部分,只有在合適的分辨率加載圖像的一部分:
https://developer.android.com/reference/android/graphics/BitmapRegionDecoder.html

縮小時,你要顯示的整個圖像縮減,使用從本BitmapRegionDecoder類採取BitmapFactory.Options參數的方法和將其設置inSampleSize爲值大於1(優選的值是2的冪):
https://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize

放大時,先放大已經顯示的較低分辨率(使用inSampleSize值> 1的分辨率),並使用BitmapRegionDecoder延遲加載較高分辨率版本(其中inSampleSize小於以前的值),並逐漸淡入較高分辨率版本。

當用戶放大,繼續這樣做,直到你inSampleSize是1

+0

我最初加載的圖像中其原始大小(與inSampleSize = 1)。當我進行「放大」時,我必須用值> 1更改inSampleSize,然後裁剪圖像? – Giammy 2013-03-12 16:16:20

+0

用戶放大之前,用inSampleSize> 1加載整個圖像。然後,當用戶放大時,在某些點上,您將再次加載圖像,但只加載一部分圖像,並且inSampleSize的值較低(但仍然超過1)。當用戶一次又一次放大時,在某些時候,您的inSampleSize = 1(並且您只會加載可見的部分)。 – 2013-03-12 18:52:58