我正在尝试将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;
}
}
图像被发送到这样的功能
jbyte* cImageIn = env->GetByteArrayElements(imageIn, &b);
jbyte* cImageOut = (jbyte*)env->GetDirectBufferAddress(imageOut);
toGreyscale((byte*)cImageIn, widthIn, heightIn, (byte*)cImageOut);
我得到的结果是水平反转的图像(不知道为什么......显示结果的UV是正确的......),但最大的问题是当我显示它们时只有红色通道实际上是正确的分别。绿色和蓝色通道都搞砸了,我不明白为什么。我在互联网上查了一下,我找到的所有资源都表明我使用的面具是正确的。知道错误可能在哪里吗?
谢谢!
答案 0 :(得分:0)
可能是一个结束问题?
在移出RGB分量之前,您可以通过反转16位字的两个字节来快速检查。