我已经掌握了16位rgb565图像(特别是Android帧缓冲区转储),我想将其转换为24位rgb888,以便在普通显示器上查看.
问题是,如何将5位或6位通道转换为8位?明显的答案是改变它.我开始写这篇文章:
puts("P6 320 480 255");
uint16_t buf;
while (read(0, &buf, sizeof buf)) {
unsigned char red = (buf & 0xf800) >> 11;
unsigned char green = (buf & 0x07e0) >> 5;
unsigned char blue = buf & 0x001f;
putchar(red << 3);
putchar(green << 2);
putchar(blue << 3);
}
Run Code Online (Sandbox Code Playgroud)
但是,这没有我想要的一个属性,而是用于0xffff映射到0xffffff,而不是0xf8fcf8.我需要以某种方式扩展价值,但我不确定这应该如何运作.
Android SDK附带了一个名为ddms(Dalvik Debug Monitor)的工具,可以捕获屏幕截图.据我所知,通过阅读代码,它实现了相同的逻辑; 但它的截图不同,白色映射为白色.
这是原始帧缓冲,ddms 的智能转换,以及上述算法的哑转换.请注意,后者稍微更暗,更绿.
(顺便说一下,这个转换是在ffmpeg中实现的,但它只是执行上面列出的哑转换,使LSB全部为零.)
我想我有两个问题:
我正在开发一个带TFT触摸屏的项目,这个屏幕上有一个包含的库.但经过一些阅读,我仍然没有得到什么.在库中有一些关于颜色的定义:
/* some RGB color definitions */
#define Black 0x0000 /* 0, 0, 0 */
#define Navy 0x000F /* 0, 0, 128 */
#define DarkGreen 0x03E0 /* 0, 128, 0 */
#define DarkCyan 0x03EF /* 0, 128, 128 */
#define Maroon 0x7800 /* 128, 0, 0 */
#define Purple 0x780F /* 128, 0, 128 */
#define Olive 0x7BE0 /* 128, 128, 0 */
#define LightGrey 0xC618 /* 192, 192, 192 */
#define DarkGrey 0x7BEF /* 128, 128, 128 */
#define …Run Code Online (Sandbox Code Playgroud)