YUY2转RGB各种版本
2011-12-18 19:19
309 查看
一篇介绍RGB与YUV原理的文章http://kb.cnblogs.com/a/1272763/
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//B = 1.164(Y - 16) + 2.018(U - 128)
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
//R = 1.164(Y - 16) + 1.596(V - 128)
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
*(RGBbuff) = (BYTE)(Y0 + (1.370705 * (V-128)));
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));
*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));
++RGBbuff;
}
}
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//R = Y + 1.14V
//G = Y - 0.39U - 0.58V
//B = Y + 2.03U
// R = Y + 1.403V'
//G = Y - 0.344U' - 0.714V'
//B = Y + 1.770U'
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
float R,G,B;
R = (Y0 + 1.14f*V);
G=(Y0 - 0.39f*U-0.58f*V);
B=(Y0 +2.03f*U);
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(RGBbuff) = (BYTE)B;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)R;
R = (Y1 + 1.14f*V);
G=(Y1 - 0.39f*U-0.58f*V);
B=(Y1 +2.03f*U) ;
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(++RGBbuff) = (BYTE)B;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)R;
++RGBbuff;
}
}
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
// R = Y + 1.403V'
//G = Y - 0.344U' - 0.714V'
//B = Y + 1.770U'
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
float R,G,B;
R = (Y0 + 1.403f*V);
G=(Y0 - 0.344f*U-0.714f*V);
B=(Y0 +1.77f*U);
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(RGBbuff) = (BYTE)R;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)B;
R = (Y1 + 1.403f*V);
G=(Y1 - 0.344f*U-0.714f*V);
B=(Y1 +1.77f*U);
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(++RGBbuff) = (BYTE)R;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)B;
++RGBbuff;
}
}
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//B = 1.164(Y - 16) + 2.018(U - 128)
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
//R = 1.164(Y - 16) + 1.596(V - 128)
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
*(RGBbuff) = (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));
++RGBbuff;
}
}
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//
//C = Y - 16
//D = U - 128
//E = V - 128
//R = clip(( 298 * C + 409 * E + 128) >> 8)
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
//B = clip(( 298 * C + 516 * D + 128) >> 8)
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
BYTE Y0 = *YUY2buff;
BYTE U = *(++YUY2buff);
BYTE Y1 = *(++YUY2buff);
BYTE V = *(++YUY2buff);
++YUY2buff;
LONG Y,C,D,E;
BYTE R,G,B;
Y = Y0;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
Y = Y1;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(++RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
++RGBbuff;
}
}
BYTE VC4000Graber::clip255(LONG v)
{
if(v<0) v=0;
else if(v>255) v=255;
return (BYTE)v;
}
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//B = 1.164(Y - 16) + 2.018(U - 128)
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
//R = 1.164(Y - 16) + 1.596(V - 128)
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
*(RGBbuff) = (BYTE)(Y0 + (1.370705 * (V-128)));
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));
*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));
++RGBbuff;
}
}
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//R = Y + 1.14V
//G = Y - 0.39U - 0.58V
//B = Y + 2.03U
// R = Y + 1.403V'
//G = Y - 0.344U' - 0.714V'
//B = Y + 1.770U'
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
float R,G,B;
R = (Y0 + 1.14f*V);
G=(Y0 - 0.39f*U-0.58f*V);
B=(Y0 +2.03f*U);
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(RGBbuff) = (BYTE)B;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)R;
R = (Y1 + 1.14f*V);
G=(Y1 - 0.39f*U-0.58f*V);
B=(Y1 +2.03f*U) ;
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(++RGBbuff) = (BYTE)B;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)R;
++RGBbuff;
}
}
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
// R = Y + 1.403V'
//G = Y - 0.344U' - 0.714V'
//B = Y + 1.770U'
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
float R,G,B;
R = (Y0 + 1.403f*V);
G=(Y0 - 0.344f*U-0.714f*V);
B=(Y0 +1.77f*U);
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(RGBbuff) = (BYTE)R;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)B;
R = (Y1 + 1.403f*V);
G=(Y1 - 0.344f*U-0.714f*V);
B=(Y1 +1.77f*U);
if(R<0) R =0;
if(R>255) R=255;
if(G<0) G =0;
if(G>255) G=255;
if(B<0) B =0;
if(B>255) B=255;
*(++RGBbuff) = (BYTE)R;
*(++RGBbuff) = (BYTE)G;
*(++RGBbuff) = (BYTE)B;
++RGBbuff;
}
}
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//B = 1.164(Y - 16) + 2.018(U - 128)
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
//R = 1.164(Y - 16) + 1.596(V - 128)
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
float Y0 = *YUY2buff;
float U = *(++YUY2buff);
float Y1 = *(++YUY2buff);
float V = *(++YUY2buff);
++YUY2buff;
*(RGBbuff) = (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));
++RGBbuff;
}
}
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
//
//C = Y - 16
//D = U - 128
//E = V - 128
//R = clip(( 298 * C + 409 * E + 128) >> 8)
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
//B = clip(( 298 * C + 516 * D + 128) >> 8)
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
//Y0 U0 Y1 V0
BYTE Y0 = *YUY2buff;
BYTE U = *(++YUY2buff);
BYTE Y1 = *(++YUY2buff);
BYTE V = *(++YUY2buff);
++YUY2buff;
LONG Y,C,D,E;
BYTE R,G,B;
Y = Y0;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
Y = Y1;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(++RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
++RGBbuff;
}
}
BYTE VC4000Graber::clip255(LONG v)
{
if(v<0) v=0;
else if(v>255) v=255;
return (BYTE)v;
}
相关文章推荐
- YUY2转RGB 的各种版本
- YUY2转RGB 的各种版本
- YUY2转RGB 的各种版本
- YUY2转RGB 的各种版本
- 各种颜色的RGB值
- 新浪微博url与mid相互转换(自己总结整理各种语言版本)
- MySQL各种版本的下载方式
- Visual Studio开发工具(3)Visual Studio 2010各种版本资源下载连接汇总
- VS2015终极卸载方法(适用于VS各种版本)
- BaseAnimation是基于开源的APP,致力于收集各种动画效果(最新版本1.3)
- 【C#】RGB,CMYK,HSB各种颜色表示的转换(转)
- zend framework 各种版本下载地址 http://framework.zend.com/download/archives/
- 各种mysql版本下载
- CCProtocols(各种协议CCRGBAProtocol:函数-透明度是否改变RGB、颜色是否下传。混合协议+CCTextureProtocol+字体协议+导演协议 )
- 轻松使用 ffmpeg sdk 实现各种格式的rgb以及yuv raw
- 各种颜色RGB代码
- YUY2(YUV) 与 RGB 格式图片的相互转换 以及 基于YUY2(YUV)的blending
- IOS--OC获取app应用版本的信息和当前设备的各种信息,跳转到appstore(二)
- 谈谈RGB、YUY2、YUYV、YVYU、UYVY、AYUV
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )