/ / Android Renderscriptで畳み込み乗算を作成するにはどうすればよいですか? -android、畳み込み、renderscript

Android Renderscriptで畳み込み乗算を書くには? - アンドロイド、コンボルーション、レンダスクリプト

私はAndroidRenderscriptを初めて使用します。最終的なアプリケーションはAndroidで実行されるため、RenderScriptで畳み込み乗算を作成する必要があります。データストリームは画像になります。 具体的には、Javaで作成できますが、forEach機能を使用してコアロジックを作成することはできませんが、速度が遅すぎます。 助けてください! スティーブ

回答:

回答№1は8

rsForEach呼び出し(または他のRenderscript)中関数)、元の画像の割り当てをRenderscript内のポインターにバインドして、配列としてアクセスできるようにすることで、元の画像(または使用しているデータの種類)の隣接するピクセルにアクセスできます。 HelloComputeの例に基づく例を次に示します。

#pragma version(1)
#pragma rs java_package_name(com.android.example.hellocompute)

rs_allocation gIn;
rs_allocation gOut;
rs_script gScript;

static int mImageWidth;
const uchar4 *gPixels;

const float4 kWhite = {
1.0f, 1.0f, 1.0f, 1.0f
};
const float4 kBlack = {
0.0f, 0.0f, 0.0f, 1.0f
};

void init() {
}

static const int kBlurWidth = 20;
static const float kMultiplier = 1.0f / (float)(kBlurWidth * 2 + 1);

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) {
float4 original = rsUnpackColor8888(*v_in);

float4 colour = original * kMultiplier;

int y_component = mImageWidth * y;

for ( int i = -kBlurWidth; i < 0; i++) {
float4 temp_colour;

if ( (int)x + i >= 0) {
temp_colour = rsUnpackColor8888(gPixels[x+i + y_component]);
}
else {
temp_colour = kWhite;
}

colour += temp_colour * kMultiplier;
}
for ( int i = 1; i <= kBlurWidth; i++) {
float4 temp_colour;

if ( x + i < mImageWidth) {
temp_colour = rsUnpackColor8888(gPixels[x+i + y_component]);
}
else {
temp_colour = kWhite;
}

colour += temp_colour * kMultiplier;
}

colour.a = 1.0f;
*v_out = rsPackColorTo8888(colour);
}


void filter() {
mImageWidth = rsAllocationGetDimX(gIn);
rsDebug("Image size is ", rsAllocationGetDimX(gIn), rsAllocationGetDimY(gOut));
rsForEach(gScript, gIn, gOut, NULL);
}

次のJavaから呼び出されます。mScript.bind_gPixels(mInAllocation)の呼び出しに注意してください。これは、元の画像データをRenderscriptのgPixelポインターにバインドするため、画像データを配列として使用できるようにします。

    mRS = RenderScript.create(this);

mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,
Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());

mScript = new ScriptC_blur(mRS, getResources(), R.raw.blur);

mScript.bind_gPixels(mInAllocation);

mScript.set_gIn(mInAllocation);
mScript.set_gOut(mOutAllocation);
mScript.set_gScript(mScript);
mScript.invoke_filter();
mOutAllocation.copyTo(mBitmapOut);