RGB24-》uyvy的转换

沧海一朵浪 2009-06-11 04:41:51
高分求:我按照网络上的公式,算出来不对啊,请给出源码?
谢谢
...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaa3105563 2009-06-11
  • 打赏
  • 举报
回复
帮顶·
jtujtujtu 2009-06-11
  • 打赏
  • 举报
回复
不好意思
忘了删除个东西

公式来自于 msdn:

http://msdn2.microsoft.com/en-us/library/ms893078.aspx

//////////////////////////////////////////////////////////////////////////
// RGB2YUV
// pRGB point to the RGB data
// pYUV point to the YUV data
// width width of the picture
// height height of the picture
//////////////////////////////////////////////////////////////////////////
int RGB2YUV(void* pRGB, void* pYUV, int width, int height)
{
if (NULL == pRGB)
{
return -1;
}
unsigned char* pRGBData = (unsigned char *)pRGB;
unsigned char* pYUVData = (unsigned char *)pYUV;
if (NULL == pYUVData)
{
pYUVData = new unsigned char[width*height*2];
}
int R1, G1, B1, R2, G2, B2, Y1, U1, Y2, V1;
for (int i=0; i <height; ++i)
{
for (int j=0; j <width/2; ++j)
{
B1 = *(pRGBData+(height-i-1)*width*3+j*6);
G1 = *(pRGBData+(height-i-1)*width*3+j*6+1);
R1 = *(pRGBData+(height-i-1)*width*3+j*6+2);
B2 = *(pRGBData+(height-i-1)*width*3+j*6+3);
G2 = *(pRGBData+(height-i-1)*width*3+j*6+4);
R2 = *(pRGBData+(height-i-1)*width*3+j*6+5);
Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);
U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);
Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;
V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);
*(pYUVData+i*width*2+j*4) = Y1;
*(pYUVData+i*width*2+j*4+1) = U1;
*(pYUVData+i*width*2+j*4+2) = Y2;
*(pYUVData+i*width*2+j*4+3) = V1;
}
}
return 0;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jtujtujtu/archive/2009/02/10/3874621.aspx
jtujtujtu 2009-06-11
  • 打赏
  • 举报
回复
公式来自于 msdn:

http://msdn2.microsoft.com/en-us/library/ms893078.aspx

//////////////////////////////////////////////////////////////////////////
// RGB2YUV
// pRGB point to the RGB data
// pYUV point to the YUV data
// width width of the picture
// height height of the picture
//////////////////////////////////////////////////////////////////////////
int RGB2YUV(void* pRGB, void* pYUV, int width, int height)
{
if (NULL == pRGB)
{
return -1;
}
unsigned char* pRGBData = (unsigned char *)pRGB;
unsigned char* pYUVData = (unsigned char *)pYUV;
if (NULL == pYUVData)
{
if (alphaYUV)
{
pYUVData = new unsigned char[width*height*3];
}
else
pYUVData = new unsigned char[width*height*2];
}
int R1, G1, B1, R2, G2, B2, Y1, U1, Y2, V1;
int alpha1, alpha2;
for (int i=0; i<height; ++i)
{
for (int j=0; j<width/2; ++j)
{
B1 = *(pRGBData+(height-i-1)*width*3+j*6);
G1 = *(pRGBData+(height-i-1)*width*3+j*6+1);
R1 = *(pRGBData+(height-i-1)*width*3+j*6+2);
B2 = *(pRGBData+(height-i-1)*width*3+j*6+3);
G2 = *(pRGBData+(height-i-1)*width*3+j*6+4);
R2 = *(pRGBData+(height-i-1)*width*3+j*6+5);
Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);
U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);
Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;
V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);
*(pYUVData+i*width*2+j*4) = Y1;
*(pYUVData+i*width*2+j*4+1) = U1;
*(pYUVData+i*width*2+j*4+2) = Y2;
*(pYUVData+i*width*2+j*4+3) = V1;
}
}
return 0;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jtujtujtu/archive/2009/02/10/3874621.aspx

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧