Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将RGB565转换为灰度(8位)_Android_Java Native Interface_Bit_Android Ndk - Fatal编程技术网

Android 将RGB565转换为灰度(8位)

Android 将RGB565转换为灰度(8位),android,java-native-interface,bit,android-ndk,Android,Java Native Interface,Bit,Android Ndk,我正在尝试将rgb565图像(来自Android手机摄像头的视频流)转换为灰度(8位)图像 到目前为止,我得到了以下代码(转换是使用Android NDK在本机代码中计算的)。请注意,我的输入图像是640*480,我希望对其进行裁剪,使其适合128*128缓冲区 #define RED(a) ((((a) & 0xf800) >> 11) << 3) #define GREEN(a) ((((a) & 0x07e0) >> 5)

我正在尝试将rgb565图像(来自Android手机摄像头的视频流)转换为灰度(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是正确的…),但最大的问题是,当我单独显示它们时,只有红色通道是正确的。绿色和蓝色通道都乱七八糟,我不知道为什么。我在网上查了一下,找到的所有资料都表明我使用的面具是正确的。知道错误在哪里吗


谢谢

可能是一个持久性问题

在移出RGB组件之前,您可以通过反转16位字的两个字节来快速检查

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