2011-11-21 44 views
4

我有一个大的内存问题:的OutOfMemoryError:Android的大位图的旋转(90°)

// in sourceImage is a big JPEG previously loaded 
Matrix mat = new Matrix(); 
mat.postRotate(90); 
Bitmap rotatedImage = Bitmap.createBitmap(sourceImage, 0, 0, sourceImage.getWidth(), sourceImage.getHeight(), mat, true); 

我总是运行这段代码,我的应用程序崩溃,并且说“VM不会让我们分配XXXXXX字节”

你能帮我吗?

编辑:

我看到很多类似的问题在这里,但我不知道如何rotatating之前回收sourceImage ......(导致二审是大的同时保持它)

谢谢。

+1

如果你的源图像很大,它已经消耗了太多的可用内存。在此操作之后,您将图像在内存中保存两次('sourceImage'和旋转后的版本'rotatedImage')。这可能太多了。请在这个网站上搜索“OutOfMemoryException”,这个问题已经被多次询问和回答。 – 2011-11-21 13:10:25

+0

感谢您的评论,是的,我在这里看到很多类似的问题,但我想知道如何在RAM中不保存两个位图实例的情况下做到这一点。 – Lyra

回答

2

如果不在内存中保存临时2位图,则无法创建新的旋转位图。

但是,您可以显示旋转的位图而不创建新的位图(应用转换)。

ImageView不具有旋转功能,所以您应该编写自己的ImageView扩展版本(RotatedImageView?)。

想法是用这样的东西(未测试)重写onDraw方法。

@Override 
public void onDraw(Canvas canvas) {  
    canvas.rotate((int)(angle * 180/Math.PI), getWidth() >> 1, getHeight() >> 1); 
    super.onDraw(canvas); 
} 
+0

感谢您的回答,但我的问题是,我必须将旋转后的图像作为位图,因为我必须将其上传到远程服务器。我也无法更改服务器软件来处理旋转。 – Lyra

+0

很好,在这种情况下,你可以做到这一点的希望很小。考虑使用较小的位图或旋转位图服务器端。如果你的bitmpa具有销售宽度和高度,你可以编写一个非常复杂的算法(使用getPixel和setPixel)来旋转同一个内存块上的位图,但这会非常难以编码,而且执行速度很慢。 – jptsetung

+0

好的,我想我会将轮换导出到服务器的工作。我也认为调整图像大小以及使用getpixel和setpixel的选项应该可行,但正如您所说,这需要几分钟的时间。 – Lyra