2012-05-09 59 views
0

我有以下的代碼,我從另一個應用程序的OutOfMemoryError:位圖大小超過上裝載DICOM圖像VM預算

public static Bitmap createBitMap(DicomObject dcmObj) { 
    short[] image = dcmObj.getShorts(Integer.parseInt("7FE00010", 16)); 
    float wc = dcmObj.getFloat(Integer.parseInt("00281050", 16)); 
    float ww = dcmObj.getFloat(Integer.parseInt("00281051", 16)); 

    Bitmap bitMap = Bitmap.createBitmap(dcmObj.getInt(Tag.Columns), dcmObj 
      .getInt(Tag.Rows), Bitmap.Config.ARGB_8888); 
      bitMap.copyPixelsFromBuffer(LocalImport.makeBuffer((localImport 
      .applyWindowing(image, wc, ww)), dcmObj.getInt(Tag.Columns), 
      dcmObj.getInt(Tag.Rows))); 
    return bitMap; 
} 

了我所試圖做的是從SD卡中加載一些DICOM圖像讀取屬性並在網格中顯示它們。 上面的函數對應用程序工作正常,但是當我將相同的代碼集成到我的應用程序時,它崩潰了。 我試過調試,但變量的值是相同的。

+0

剛剛發現,如果我修改位圖位圖的參數=位圖

謝謝.createBitmap(dcmObj.getInt(Tag.Columns),dcmObj .getInt(Tag.Rows),Bitmap.Config.ARGB_8888);位圖bitmap = Bitmap.createBitmap(dcmObj.getInt(Tag.Columns)-100,dcmObj .getInt(Tag.Rows)-100,Bitmap.Config.ARGB_8888);撞車不會發生,但圖像不好。通過將配置更改爲Config.RGB_565也可以避免崩潰,但加載的圖像失真。 – Preethi

+0

您需要縮小圖像的大小。當你調整它的大小時,你應該用2的冪來實現,所以它的一半,四分之一等等。這會給你最高質量的調整大小。 –

+0

謝謝@DavidScott。崩潰不會發生,但我在網格視圖中獲得空白圖像。 :( – Preethi

回答

0

崩潰是因爲主UI中的動畫佔用大量內存。 示例應用程序我複製了代碼dint有任何動畫。

猜測增加模擬器中分配的內存大小可以解決問題(請試用一下)。

但至少我知道它不是因爲我說好的做任何取消分配或邏輯錯誤的..所有的幫助:)

+0

添加完成操作有助於減少主UI中的內存使用情況:) – Preethi

0

在對Android進行更改之前,分配大於VM限制的緩衝區的唯一方法是在本機代碼中分配它們。在本機代碼中,您可以爲Android系統下的Linux系統分配儘可能多的內存。我已經用我自己的應用程序測試過這個,並且分配的位圖大於150MB。在本地代碼中管理位圖將需要編寫代碼,將位圖的「視圖」渲染爲由Java管理的顯示大小的圖像。

+0

感謝@BitBank,但我不知道,如果我明白你說什麼..接受:(我是一個新手在這個領域。但我正在尋找通過了解本地代碼。反正..我懷疑內存泄漏 – Preethi

+0

當處理大的位圖時,很容易超出虛擬機的內存限制,一個3000x3000像素的RGB888位圖會超出限制(3000x3000x4bytes = 36MB)。本地代碼(NDK-C/C++/ASM)可以調用較低級別的內存分配函數並訪問手機的所有內存。) – BitBank

相關問題