c语言bmp图像YUV转化成RGB,RGB与YUV图像格式的相互转换

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字节顺序如下图:

100211155500.jpg

(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));

//分配图片像素内存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值