Android加载大型位图

8

我正在制作一款Android应用程序,需要在画布上加载并使用“捏合缩放”手势调整大小的图像(位图)。然而,当图像超过一定大小时,应用程序会崩溃(OutOfMemory异常)。如何优化图像的加载和处理?

我使用以下方法加载图像:

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

绘制它的方法:

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

改变它的大小:
Bitmap.createScaledBitmap (originalBitmap, neww, NEWH, true);
1个回答

4

这并不是一件小事。

根据当前图像的比例和当前显示的部分,仅以适当的分辨率加载该图像的部分内容:
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。


我最初是以其原始大小加载图像(inSampleSize = 1)。当我进行“放大”时,必须使用值>1更改inSampleSize,然后裁剪图像吗? - Giammy
在用户缩放之前,您将整个图像加载到inSampleSize>1中。然后当用户缩放时,在某些点上,您将再次加载图像,但仅部分加载,并且具有较低值的inSampleSize(但仍大于1)。当用户一遍又一遍地缩放时,最终您的inSampleSize = 1(并且您只加载了可见部分)。 - Streets Of Boston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接