2011-06-23 214 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; 
    } 
} 

的圖像發送到函數這樣

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

結果我得到的是一個水平反轉圖像(不知道爲什麼...的UV的顯示結果是正確的.. ),但最大的問題是,當我單獨顯示紅色通道時,實際上只有紅色通道是正確的。綠色和藍色的渠道都搞砸了,我不知道爲什麼。我在互聯網上查了一下,發現所有資源都顯示我使用的面具是正確的。任何想法的錯誤可能是?

謝謝!

回答

0

可能是一個endianess問題?

在移出RGB分量之前,可以通過反轉16位字的兩個字節來快速檢查。