Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OutOfMemoryError:加载DICOM图像时位图大小超过VM预算_Android_Out Of Memory_Dicom - Fatal编程技术网

Android OutOfMemoryError:加载DICOM图像时位图大小超过VM预算

Android OutOfMemoryError:加载DICOM图像时位图大小超过VM预算,android,out-of-memory,dicom,Android,Out Of Memory,Dicom,我从另一个应用程序中获取了以下代码 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(Int

我从另一个应用程序中获取了以下代码

    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图像,读取属性并在网格中显示它们。 上面的函数在应用程序中运行良好,但当我将相同的代码集成到应用程序中时,它会崩溃。
我尝试过调试,但变量的值是相同的。

在对Android进行更改之前,分配大于VM限制的缓冲区的唯一方法是在本机代码中分配它们。在本机代码中,您可以为Android下的linux系统分配尽可能多的物理可用内存。我已经用自己的应用程序对此进行了测试,并分配了大于150MB的位图。然后,在本机代码中管理位图将需要编写代码,将位图的“视图”渲染成由Java管理的显示大小的图像。

崩溃是因为主ui中的动画占用了大量内存。 我复制的示例应用程序代码没有任何动画

猜测增加模拟器中分配的内存大小可以解决这个问题(暂时不要尝试)

但至少我知道这不是因为我没有做任何交易或逻辑错误


谢谢大家的帮助:)

刚刚发现如果我修改Bitmap Bitmap=Bitmap.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来避免崩溃,但加载的图像失真。您需要减小图像的大小。当你调整它的大小时,你应该按2的幂来做,所以一半,四分之一等等。这将给你最高质量的调整。谢谢@DavidScott。崩溃没有发生,但我在网格视图中得到了空白图像:(谢谢@BitBank,但我不确定我是否理解你所说的……对不起:(我是这一领域的新手。但我正在搜索以了解本机代码。无论如何……我怀疑我的代码存在内存泄漏问题。但我无法找到位置或方式。在使用大型位图时,很容易超过VM内存限制。3000x3000像素的RGB888位图将超过限制(3000x300x400字节=36MB)。本机代码(NDK-C/C++/ASM)可以调用较低级别的内存分配函数并访问手机的所有内存)。向活动添加finish有助于减少家庭用户界面中的内存使用:)