4

JNI にバイト配列としてグレースケール イメージがあり、それを Android に渡して画面に表示する必要があります。現時点で私のコードは次のとおりです。バイト配列を JNI の int 配列にコピーし、その配列でビットマップのピクセルを設定します。

JNI 側:

jintArray frame = g_env->NewIntArray(frameSize);
int tempFrame[frameSize];
for(int pix = 0; pix < frameSize; pix++){
    //convert every byte to int
    jint greyValue = 0xff000000 | (( byteArray[pix] << 16) & 0xffff0000) | ((byteArray[pix] << 8) & 0xff00ff00) | (byteArray[pix] & 0xff0000ff);
    tempFrame[pix] = greyValue;
}
g_env->SetIntArrayRegion(frame, 0, frameSize, tempFrame);

//return the array setting a variable in java
g_env->SetObjectField(g_o, g_env->GetFieldID(g_class, "mFrame", "[I"), frame);

次に、Java 側:

//Somewhere in SurfaceView.surfaceCreated method
if(mBitmap == null)
    mBitmap = Bitmap.createBitmap(mImageWidth, mImageHeight, Bitmap.Config.ARGB_8888);

//Somewhere in View.onDraw method
if(mBitmap != null && nativeClass.mFrame != null){
    mBitmap.setPixels(nativeClass.mFrame, 0, mImageWidth, 0, 0, mImageWidth, mImageHeight);

    //Do some operations on the bitmap with mBitmap.setPixel()

    canvas.drawBitmap(mBitmap, srcRect, dstRect, null);
}

プロセスをスピードアップする方法があるかどうか疑問に思っていました。たとえば、Bitmap に直接書き込むか、またはJNI で Bitmap を作成し、それを Android に渡します。(canvas には Bitmap の代わりに int[] を受け入れる drawBitmap メソッドがあることは知っていますが、そのメソッドは再スケーリングのために Rects を受け入れないため、実現可能ではありません)

4

1 に答える 1

3

簡単な方法:

Java コードでビットマップを作成します。ネイティブ コードでビットマップ参照を渡します。AndroidBitmap_lockPixelsピクセル値の配列を取得するために使用します。配列にデータを入力します。最後に電話AndroidBitmap_unlockPixels

難しい方法。

于 2013-01-11T11:21:31.307 に答える