0
最近、私が実装している間にRenderScript
の使用法を学んでいますブラー効果。次にビットマップの一部を拡大したいと思います。私は、ビットマップを処理する.rs
コード流れる使用レンダスクリプトを使用してビットマップの一部を拡大する
:ご覧のように、第1、
#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コード: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;
}
、私が最初にtraversal
カーネルメソッドを呼び出します。それから私はinvert
と呼ぶ。
しかし、それは私のためには機能しません。
おかげ
メインコードは(私はそれ自動explicative作ってみました)以下であります!それは私のためにうまく動作します – CoXier
あなたは大歓迎です! :) – cmaster11
私はカーネルメソッドのparam型で混乱しています。 'int'と' uint32_t 'の違いは何ですか? – CoXier