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