原文地址:http://blog.youkuaiyun.com/juyingmin/article/details/5733761
在视频采集和视频的编解码中,常出现RGB16的数据格式,而我们最常用是图像处理数据格式为RGB24。他们之间需要转换,整理如下:
RGB16数据像数数据格式有二种:
(1)RGB565 每个像素用16位表示,RGB分量分别使用5位、6位、5位
(2)RGB555 每个像素用16位表示,RGB分量都使用5位(剩下的1位不用)
RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:
高字节 低字节
R R R R R G G G G G G B B B B B
- void Tran565to24(unsigned char* src, int w, int h, RtImage* dst)
- {
- int x = 0, y = 0;
- int pos = 0;
- unsigned char val0 = val1 = 0;
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- pos = (y * w + x) * 2;
- val0 = *(src + pos);
- val1 = *(src + pos + 1);
- pos = dst->widthStep * y + x * dst->nChannels;
- *(dst->imageData + pos + 0) = val0 << 3;
- *(dst->imageData + pos + 1) = (val1 << 5) | ((val0 >> 3) & 0x1C);
- *(dst->imageData + pos + 2) = val1 & 0xF8;
- }
- }
- }
RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
高字节 低字节
X R R R R G G G G G B B B B B (X表示不用,可以忽略)
- void Tran555to24(unsigned char* src, int w, int h, RtImage* dst)
- {
- int x = 0, y = 0;
- int pos = 0;
- unsigned char val0 = val1 = 0;
- for (y = 0; y < h; y++)
- {
- for (x = 0; x < w; x++)
- {
- pos = (y * w + x) * 2;
- val0 = *(src + pos);
- val1 = *(src + pos + 1);
- pos = dst->widthStep * y + x * dst->nChannels;
- *(dst->imageData + pos + 0) = val0 << 3;
- *(dst->imageData + pos + 1) = (val1 << 6) | ((val0 >> 2) & 0x38);
- *(dst->imageData + pos + 2) = (val1<<1) & 0xF8;
- }
- }
- }