#include "StdAfx.h"
#include "RGB2YUV.h"
CRGB2YUV::CRGB2YUV(void)
{
}
CRGB2YUV::~CRGB2YUV(void)
{
}
void CRGB2YUV::Free()
{
memset(RGB2YUV_YR, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_YG, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_YB, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_UR, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_UG, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_UBVR, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_VG, 0, sizeof(RGB2YUV_YR));
memset(RGB2YUV_VB, 0, sizeof(RGB2YUV_YR));
}
//
// Table used for RGB to YUV420 conversion
//
void CRGB2YUV::InitLookupTable()
{
int i=0;
for (i = 0; i < 256; i++) RGB2YUV_YR[i] = (float)65.481 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_YG[i] = (float)128.553 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_YB[i] = (float)24.966 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_UR[i] = (float)37.797 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_UG[i] = (float)74.203 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_VG[i] = (float)93.786 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_VB[i] = (float)18.214 * (i<<8);
for (i = 0; i < 256; i++) RGB2YUV_UBVR[i] = (float)112 * (i<<8);
}
//
// Convert from RGB24 to YUV420
//
bool CRGB2YUV::ConvertRGB2YUV(int w, int h, unsigned char *bmp, unsigned char *yuv)
{
unsigned char *u,*v,*y,*uu,*vv;
unsigned char *pu1,*pu2,*pu3,*pu4;
unsigned char *pv1,*pv2,*pv3,*pv4;
unsigned char *r,*g,*b;
int i,j;
uu=new unsigned char[w*h];
vv=new unsigned char[w*h];
if(uu==NULL || vv==NULL)
return false;
y=yuv;
u=uu;
v=vv;
//Get r,g,b pointers from bmp image data....
r=bmp;
g=bmp+1;
b=bmp+2;
//Get YUV values for rgb values...
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
*y++=( RGB2YUV_YR[*r] +RGB2YUV_YG[*g] +RGB2YUV_YB[*b] +1048576) >>16;
*u++=(-RGB2YUV_UR[*r] -RGB2YUV_UG[*g] +RGB2YUV_UBVR[*b] +8388608) >>16;
*v++=( RGB2YUV_UBVR[*r] -RGB2YUV_VG[*g] -RGB2YUV_VB[*b] +8388608) >>16;
r+=3;
g+=3;
b+=3;
}
}
// Now sample the U & V to obtain YUV 4:2:0 format
// Sampling mechanism...
/*
@ -> Y
# -> U or V
@ @ @ @
# #
@ @ @ @
@ @ @ @
# #
@ @ @ @
*/
// Get the right pointers...
u=yuv+w*h;
v=u+(w*h)/4;
// For U
pu1=uu;
pu2=pu1+1;
pu3=pu1+w;
pu4=pu3+1;
// For V
pv1=vv;
pv2=pv1+1;
pv3=pv1+w;
pv4=pv3+1;
// Do sampling....
for(i=0;i<h;i+=2)
{
for(j=0;j<w;j+=2)
{
*u++=(*pu1+*pu2+*pu3+*pu4)>>2;
*v++=(*pv1+*pv2+*pv3+*pv4)>>2;
pu1+=2;
pu2+=2;
pu3+=2;
pu4+=2;
pv1+=2;
pv2+=2;
pv3+=2;
pv4+=2;
}
pu1+=w;
pu2+=w;
pu3+=w;
pu4+=w;
pv1+=w;
pv2+=w;
pv3+=w;
pv4+=w;
}
delete uu;
delete vv;
return true;
}
RGB24 to YUV420
4星 · 超过85%的资源 需积分: 24 169 浏览量
2010-08-12
09:36:58
上传
评论 2
收藏 2KB RAR 举报
gzgard
- 粉丝: 2
- 资源: 35
最新资源
- xyctf:从入门到精通的实用指南.zip
- mmqrcode1714153659780.png
- Screenshot_2024-04-27-06-08-58-486_com.baidu.xin.aiqicha.jpg
- 基于Javaweb+Tomcat+MySQL的大学生公寓管理系统+sql文件.zip
- 实训作业基于javaweb的订单管理系统源码+数据库+实训报告.zip
- 多机调度问题贪心算法基于最小堆和贪心算法求解多机调度问题.zip
- 基于同态加密技术的匿名电子投票系统源码.zip
- Pyqt5项目框架-PyQt项目开发实践
- 基于C通过MQTT的智能农业大棚管理系统(本科毕业设计)
- python+CNN的网络入侵检测算法源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页