2011-06-23 60 views
3

rgb565イメージ(Android電話カメラからのビデオストリーム)をグレースケール(8ビット)イメージに変換しようとしています。RGB565をグレースケール(8ビット)に変換する

これまでのところ、私は変換がAndroid NDKを使用してネイティブコードで計算されています。私の入力イメージは640 * 480であり、それを128 * 128バッファに収めるために切り抜きたいと思います。

#define RED(a)  ((((a) & 0xf800) >> 11) << 3) 
#define GREEN(a) ((((a) & 0x07e0) >> 5) << 2) 
#define BLUE(a)  (((a) & 0x001f) << 3) 

typedef unsigned char byte; 

void toGreyscale(byte *rgbs, int widthIn, int heightIn, byte *greyscales) 
{ 
    const int textSize = 128; 
    int x,y; 
    short* rgbPtr = (short*)rgbs; 
    byte *greyPtr = greyscales; 

    // rgbs arrives in RGB565 (16 bits) format 
    for (y=0; y<textSize; y++) 
    { 
     for (x=0; x<textSize; x++) 
     { 
      short pixel = *(rgbPtr++); 
      int r = RED(pixel); 
      int g = GREEN(pixel); 
      int b = BLUE(pixel); 

      *(greyPtr++) = (byte)((r+g+b)/3); 
     } 
     rgbPtr += widthIn - textSize; 
    } 
} 

画像は私が得る結果は、水平方向に反転した画像(UVが正しい結果を表示するために、なぜ...ないアイデアです。この

jbyte* cImageIn = env->GetByteArrayElements(imageIn, &b); 
jbyte* cImageOut = (jbyte*)env->GetDirectBufferAddress(imageOut); 
toGreyscale((byte*)cImageIn, widthIn, heightIn, (byte*)cImageOut); 

のような関数に送られます。.. 。)しかし、最大の問題は、赤いチャンネルだけが別々に表示されたときに実際に正しいことです。緑色と青色のチャンネルはすべて台無しになっていて、私はなぜそれがわからないのですか?私はインターネットでチェックし、私が見つけたすべてのリソースは、私が使用しているマスクが正しいことを示しました。間違いがどこにあるのだろうか?

ありがとうございます!

答えて

0

エンディアンの問題がありますか?

RGBコンポーネントをシフトアウトする前に、16ビットワードの2バイトを逆にすると、すぐに確認できます。

関連する問題