1

renderscript で画像を回転する必要があり、次のコードがあります。

private ScriptC_flip mScript;
Button flip = (Button)view.findViewById(R.id.flipVertical);
flip.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        mScript.set_direction(1);
        flip();
    }
});
mBitmapIn = loadBitmap(R.drawable.face2);

in = (ImageView) view.findViewById(R.id.displayin);
in.setImageBitmap(mBitmapIn);

createScript();

次の機能が必要です。

protected void flip() {
    mScript.invoke_filter();
    mOutAllocation.copyTo(mBitmapIn);

    mRS.destroy();
    mInAllocation.destroy();
    mOutAllocation.destroy();
    mScript.destroy();

    createScript();
    in.invalidate();
}

private void createScript() {
    mRS = RenderScript.create(getActivity());

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

    mScript = new ScriptC_flip(mRS, getResources(), R.raw.flip);
    mScript.set_width(mBitmapIn.getWidth());
    mScript.set_height(mBitmapIn.getHeight());
    mScript.set_gIn(mInAllocation);
    mScript.set_gOut(mOutAllocation);
    mScript.set_gScript(mScript);

}

private Bitmap loadBitmap(int resource) {
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    return BitmapFactory.decodeResource(getResources(), resource, options);
}

これは私のRenderSCriptコードです:

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

rs_allocation gIn;
rs_allocation gOut;
rs_script gScript;
int width;
int height;
int direction = 0; // 0 - flip horizontally, 1 - flip vertically
float rotation;

void init(){
    rotation = 0.0f;
}

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) {
    if(direction == 4){ // rotate right
        const uchar4 *element = rsGetElementAt(gIn, x, y);
        float4 color = rsUnpackColor8888(*element);
        float4 output = {color.r, color.g, color.b};
        *v_out = rsPackColorTo8888(output);

        rs_matrix4x4 matrix;
        rsMatrixLoadIdentity(&matrix);
        rsMatrixTranslate(&matrix, 100.0f, 100.0f, 0.0f);
        rsMatrixRotate(&matrix, rotation++, 0.0f, 0.0f, 1.0f);
        //       rsgProgramVertexLoadModelMatrix(&matrix);
    }else if(direction == 5){ // rotate right
        const uchar4 *element = rsGetElementAt(gIn, y, height - x);
        float4 color = rsUnpackColor8888(*element);
        float4 output = {color.r, color.g, color.b};
        *v_out = rsPackColorTo8888(output);
    }
}

void filter() {
    rsForEach(gScript, gIn, gOut, 0);
}

この行のコメントを解除しようとすると:

//       rsgProgramVertexLoadModelMatrix(&matrix);

このメソッドが存在しないというエラーが表示されます。なぜこうなった?他のレンダースクリプトの例で使用しました。唯一の違いは、そこには RSSurfaceView があり、ここでは画像ビューに結果を設定したことです。どうすれば回転させることができますか?「方向」を 5 に設定すると、右に 90 度回転します。「方向」= 4 で試しても、何もしません。これは、メッシュを何度も回転させる例から取ったものです

4

2 に答える 2

1

RSSurfaceView でそれを行う方法を見つけましたが、残念ながら、このクラスは非推奨になっているため、グラフィックスに renderscript を使用できなくなりました。

于 2012-11-14T09:08:04.637 に答える
1

rsgProgramVertexLoadModelMatrix 呼び出しは RenderScript のグラフィック側の一部ですが、計算スクリプトで使用しています。

元の画像の位置に行列を掛けて計算スクリプトで回転するには、次のようにします。

rs_allocation gIn;
rs_allocation gOut;
rs_script gScript;
int width;
int height;
int direction = 0; // 0 - flip horizontally, 1 - flip vertically
float rotation;

float gImageWidth;
float gImageHeight;

void init(){
    rotation = 0.0f;
}

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) {
    if(direction == 4){ // rotate right
        rs_matrix4x4 matrix;
        rsMatrixLoadIdentity(&matrix);
        rsMatrixTranslate(&matrix, gImageWidth/2.0f, gImageHeight/2.0f, 0.0f);
        rsMatrixRotate(&matrix, rotation, 0.0f, 0.0f, 1.0f);
        rsMatrixTranslate(&matrix, -gImageWidth/2.0f, -gImageHeight/2.0f, 0.0f);

        float4 in_vec = {x, y, 0.0f, 1.0f};
        float4 trans = rsMatrixMultiply( &matrix, in_vec);

        float trans_x = trans.x;
        float trans_y = trans.y;

        if ( trans_x < 0.0f) {
            trans_x = 0.0f;
        }
        else if ( trans_x >= gImageWidth) {
            trans_x = gImageWidth - 1.0f;
        }
        if ( trans_y < 0.0f) {
            trans_y = 0.0f;
        }
        else if ( trans_y >= gImageHeight) {
            trans_y = gImageHeight - 1.0f;
        }

        const uchar4 *element = rsGetElementAt(gIn, trans_x, trans_y);
        *v_out = *element;


       //rsgProgramVertexLoadModelMatrix(&matrix);
    }else if(direction == 5){ // rotate right
        const uchar4 *element = rsGetElementAt(gIn, y, height - x);
        float4 color = rsUnpackColor8888(*element);
        float4 output = {color.r, color.g, color.b};
        *v_out = rsPackColorTo8888(output);
    }
}

void filter() {
    gImageWidth = rsAllocationGetDimX(gIn);
    gImageHeight = rsAllocationGetDimY(gIn);
    rsForEach(gScript, gIn, gOut, 0);
}
于 2012-12-18T10:42:44.887 に答える