Android JNI画像を伝達パラメータとして2

779 ワード

前編ではAndroid JNIピクチャが伝達パラメータとしてアドレス伝達方式を用いることが望ましいが,ピクチャをint型配列に変換する方法に問題があるのは,一つのピクチャをint型配列に変換する際に
Bitmap img1 = ...; 
int[] pix = new int[w * h];  
img1.getPixels(pix, 0, w, 0, 0, w, h); 
ここでpixの各要素は1つの画素を表し、各要素は4バイトあり、各バイトは1つのチャネルを表し、pixをJNI関数に渡すとき
Mat myimg(h, w, CV_8UC3, (unsigned char*)cbuf);
これは間違っています.まず、3つのチャネルのMatを構築したい場合、cbufのデフォルトは4つのチャネルです.もちろん間違っています.そうすることができます.
for (int i=0; i<h; i++)
{
    for (int j=0; j<w; j++)
    {
        myimg.at<Vec3b>(i,j)[0] = (uchar)(cbuf[i*w+j]& 0x000000ff);
        myimg.at<Vec3b>(i,j)[1] = (uchar)((cbuf[i*w+j]& 0x0000ff00) >> 8);
        myimg.at<Vec3b>(i,j)[2] = (uchar)((cbuf[i*w+j]& 0x00ff0000) >> 16);
    }
}