2011-11-21 62 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