0
最近我正在学习使用RenderScript
,而我实现了模糊效果。现在我想放大一部分位图。使用renderScript放大部分位图
我用流动.rs
代码来处理位图:
#pragma version(1)
#pragma rs_fp_relaxed
#pragma rs java_package_name(com.uniquestudio.renderscript)
#include "rs_debug.rsh"
int center_x,center_y;
int radius;
int scale;
int i;
int width;
uchar4 tempArray[4194304];
void init() {
i = 0;
}
uchar4 __attribute__((kernel)) traversal(uchar4 in, uint32_t x, uint32_t y) {
tempArray[i] = in;
i++;
return in;
}
uchar4 __attribute__((kernel)) invert(uchar4 in, uint32_t x, uint32_t y) {
int distance = (int) ((center_x -x) * (center_x - x) + (center_y - y) * (center_y - y));
if(distance<radius*radius){
int src_x = (int)((float)(x - center_x)/scale + center_x);
int src_y = (int)((float)(x - center_y)/scale + center_y);
return tempArray[src_y * width + src_x];
}
return in;
}
正如你看到的,首先,我把 像素数据到一个数组tempArray
。
的Java代码:
public static Bitmap magnifierBitmap(Bitmap bitmap, int x, int y, int radius,int scale, Context context){
RenderScript rs = RenderScript.create(context);
Allocation in = Allocation.createFromBitmap(rs, bitmap);
Allocation out = Allocation.createTyped(rs,in.getType());
int width = bitmap.getWidth();
ScriptC_magnifier magnifier = new ScriptC_magnifier(rs);
magnifier.set_center_x(x);
magnifier.set_center_y(y);
magnifier.set_radius(radius);
magnifier.set_scale(scale);
magnifier.set_width(width);
// first call kernel method
magnifier.forEach_traversal(in,in);
// second call kernel method
magnifier.forEach_invert(in,out);
out.copyTo(bitmap);
rs.destroy();
magnifier.destroy();
in.destroy();
out.destroy();
return bitmap;
}
在Java代码中,我首先调用traversal
核方法。然后我拨打invert
。
但它不适用于我。
谢谢!它适用于我 – CoXier
不客气! :) – cmaster11
我对内核方法的参数类型感到困惑。'int'和'uint32_t'之间有什么不同? – CoXier