1

私は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を使用して処理していました。しかし、ここでは、どこでどのように処理するかわかりません。それを使用し、ビットマップのサイズを変更したくない(元のファイルを処理し、同じサイズの変更されたファイルを保存したい)

4

1 に答える 1

1

Android 2.3.3以降を搭載したデバイスで実行している場合は、BitmapRegionDecoderを使用して画像ファイルの一部のみを読み込むことができます。したがって、領域を読み取り、処理して結果を保存し、画像全体が処理されるまで繰り返すことができます。

実行している画像処理によっては、エッジを正しく処理するために領域をオーバーラップする必要がある場合があります。

Androidフレームワークでは、大きな画像をセクションに保存するためのBitmapRegionDecoderに相当するものはないと思います。そのため、これを実現するには外部ライブラリを使用する必要があります。PNGJのようなものは、PNGファイルの行ごとのロードと保存を可能にします(私はPNGJを使用していないので、ライブラリ自体にコメントすることはできません)。

于 2012-12-28T09:24:09.143 に答える