RGB与YUV图像格式的相互转换
(参考上的《RGB与YUV图像视频格式的相互转换》文章,做了些修改)
RGB介绍:在记录计算机图像时,最常见的是采用RGB(红、绿,蓝)颜色分量来保存颜色信息。
例如:非压缩的24位的BMP图像就采用RGB空间来保存图像。一个像素24位,每8位保存一种颜色强度(0-255),例如红色保存为0xFF0000。还有16位的RGB格式,如RGB565。
YUV介绍:YUV是被欧洲电视系统所采用的一种颜色编码方法,我国广播电视也普遍采用这类方法。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma)。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
RGB转YUV:
YUV以UYVY格式标准来说明,4:2:2格式UYVY每像素占16位,UYVY字节顺序如下图:
(UYVY字节顺序)
其中第一个字节为U0,每二个字节为Y0,依次排列如下:[U0,Y0,V0,Y1] [U1,Y2,V1,Y3] [U2,Y4,V2,Y5] ……经过仔细分析,我们要实现RGB转YUV格式的话,一个像素的RGB占用三个节,而UYVY平均每像素占用两个字节
RGB转UYVY公式如下:公式:(RGB => YCbCr)
Y = 0.257R′ + 0.504G′ + 0.098B′ + 16
Cb = -0.148R′ - 0.291G′ + 0.439B′ + 128
Cr = 0.439R′ - 0.368G′ - 0.071B′ + 128
YUV转RGB:
R= 1.0Y + 0 +1.402(V-128)
G= 1.0Y - 0.34413 (U-128)-0.71414(V-128)
B= 1.0Y + 1.772 (U-128)+0
实现代码
输入文件:test.bmp(RGB24格式)
输出文件:test.yuv(YCbCr 4:2:2格式)
/
// CRGB2YUVView message handlers
/*根据BMP文件更改,否则不能正确转换*/
#define BMP_WITH 640
#define BMP_HEIGHT 480
void CRGB2YUVView::OnReadBmp()
{
CDC *pDC = GetDC();
CRect rect;
CBrush brush(RGB(128,128,128));
GetClientRect(&rect);
pDC->FillRect(&rect, &brush);
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
char strFileName[MAX_PATH]="test.bmp";
CFile* f;
f = new CFile();
f->Open(strFileName, CFile::modeRead);
f->SeekToBegin();
f->Read(&bmfh, sizeof(bmfh));
f->Read(&bmih, sizeof(bmih));
//分配图片像素内存