为renderscript分配大位图(android)

时间:2012-12-25 00:42:34

标签: android memory image-processing bitmap renderscript

我尝试在android renderscript中制作简单的图像滤镜,它适用于小图像。然而,我得到out of memory error的照片与照相机拍摄的照片一样大(虽然一切都适用于小图像)。我知道我的代码有点糟糕(主要是从here复制而来),所以有关如何在大位图上进行renderscript计算的任何提示都很受欢迎。这里是调用rs的代码:

RenderScript rs = RenderScript.create(this);
        Allocation allocIn = Allocation.createFromBitmap(rs, bmp);
        Allocation allocOut = Allocation.createTyped(rs,  allocIn.getType());

        ScriptC_sample sc = new ScriptC_sample(rs, getResources(), R.raw.sample);

        sc.set_in(allocIn);
        sc.set_out(allocOut);

        sc.forEach_root(allocIn, allocOut);

        Bitmap bmpOut = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
        allocOut.copyTo(bmpOut);
        imgView.setImageBitmap(bmpOut);     

以下是我认为与rendescript文件本身相关的内容:

rs_allocation in;

void root(const uchar4* v_in, uchar4* v_out, const void* usrData, 
uint32_t x, uint32_t y) {

    float4 curPixel = rsUnpackColor8888(*v_in);

    // ... computations 

    *v_out = rsPackColorTo8888(curPixel.r, curPixel.g, curPixel.b, curPixel.a);
} 

我确实理解我无法将这么大的位图加载到内存中(我可以将文件加载到imageView中吗?),而且之前我曾用过JustDecodeBounds来处理它..但是我在这里不知道如何以及在何处使用它,我不想调整位图的大小(我希望处理原始文件并保存相同大小的修改文件)

1 个答案:

答案 0 :(得分:1)

如果您在使用Android 2.3.3或更高版本的设备上运行,则可以使用BitmapRegionDecoder仅读取部分图像文件。因此,您可以读取区域,处理并保存结果,然后重复,直到整个图像处理完毕。

根据您正在进行的图像处理,您可能需要重叠区域以正确处理它们的边缘。

在Android框架中,我不认为有相当于BitmapRegionDecoder用于保存部分中的大图像,因此您必须使用外部库来实现这一点。像PNGJ之类的东西允许逐行加载和保存PNG文件(我没有使用过PNGJ,因此无法对库本身进行评论)。