2013-03-10 60 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