我尝试在 android renderscript 中制作简单的图像过滤器,它确实适用于小图像。但是out of memory error
,例如,我得到的照片与用相机拍摄的照片一样大(尽管对于小图像,一切都很好)。我知道我的代码有点糟糕(主要是从这里复制的),所以任何关于如何在大位图上进行渲染脚本计算的提示都值得赞赏。这是调用 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 中吗?),而且我之前使用过 inJustDecodeBounds 来处理它。但是在这里我不知道如何以及在哪里使用它,我不想调整位图的大小(我想处理原始文件并保存相同大小的修改文件)