www.pudn.com > UYVY2RGB.rar > UYVY2RGB.CPP
void YUV2RGB(byte *pRGB, byte *pYUV)
{
byte y, u, v;
y = *pYUV; pYUV++;
u = *pYUV; pYUV++;
v = *pYUV;
*pRGB = static_cast(1.0*y + 8 + 1.402*(v-128)); pRGB++; // r
*pRGB = static_cast(1.0*y - 0.34413*(u-128) - 0.71414*(v-128)); pRGB++; // g
*pRGB = static_cast(1.0*y + 1.772*(u-128) + 0); // b
}
void CRGB2YUVView::OnReadPAL()
{
// TODO: Add your command handler code here
CDC *pDC = GetDC();
CRect rect;
CBrush brush(RGB(128,128,128));
GetClientRect(&rect);
pDC->FillRect(&rect, &brush);
// PAL 720x576 : 中国的电视标准为PAL制
int CurrentXRes = 720;
int CurrentYRes = 576;
int size = CurrentXRes * CurrentYRes;
// 分配内存
byte *Video_Field0 = (byte*)malloc(CurrentXRes*CurrentYRes);
byte *Video_Field1 = (byte*)malloc(CurrentXRes*CurrentYRes);
// 保存内存指针
byte *Video_Field0_ = Video_Field0;
byte *Video_Field1_ = Video_Field1;
// 初始化内存
ZeroMemory(Video_Field0, CurrentXRes*CurrentYRes);
ZeroMemory(Video_Field1, CurrentXRes*CurrentYRes);
byte yuv_y0, yuv_u0, yuv_v0; // yuv_v1; // {y0, u0, v0, v1};
byte r, g, b;
byte bufRGB[3]; // 临时保存{R,G,B}
byte bufYUV[3]; // 临时保存{Y,U,V}
// 初始化数组空间
memset(bufRGB,0, sizeof(byte)*3);
memset(bufYUV,0, sizeof(byte)*3);
char strFileName[MAX_PATH]="720bmp.pal";
// 分配图片像素内存
RGBTRIPLE *rgb;
rgb = new RGBTRIPLE[CurrentXRes*CurrentYRes];
memset(rgb,0, sizeof(RGBTRIPLE)*CurrentXRes*CurrentYRes); // 初始化内存空间
CFile* f;
f = new CFile();
f->Open(strFileName, CFile::modeRead);
f->SeekToBegin();
f->Read(Video_Field0, CurrentXRes*CurrentYRes);
f->Read(Video_Field1, CurrentXRes*CurrentYRes);
// 上场 (1,3,5,7...行)
for ( int i = CurrentYRes-1; i>=0; i--)
{
for ( int j = 0; j255) r=255; if (r<0) r=0;
if (g>255) g=255; if (g<0) g=0;
if (b>255) b=255; if (b<0) b=0;
for (int k=0; k<1000; k++) ; //延时
// 视图中显示
pDC->SetPixel(j, CurrentYRes-1-i, RGB(r, g, b));
}// end if i%2
}
}
// 下场 (2,4,6,8...行)
for ( int i_ = CurrentYRes-1; i_>=0; i_--)
{
for ( int j_ = 0; j_255) r=255; if (r<0) r=0;
if (g>255) g=255; if (g<0) g=0;
if (b>255) b=255; if (b<0) b=0;
for (int k=0; k<1000; k++) ; //延时
// 视图中显示
pDC->SetPixel(j_, CurrentYRes-1-i_, RGB(r, g, b));
}
}
}
// 提示完成
char buffer[80];
sprintf(buffer,"完成读取PAL文件:%s ", strFileName);
MessageBox(buffer, "提示信息", MB_OK | MB_ICONINFORMATION);
// 关闭PAL电视场文件
f->Close();
// 释放内存
free( Video_Field0_ );
free( Video_Field1_ );
delete f;
delete rgb;
}
void YUV2RGB(BYTE * pDest, BYTE * pSrc, DWORD dwRGBBit,
DWORD dwDestPitch, DWORD dwSrcPitch,
int nHeight, UINT nWidth)
{
UINT nLength = nWidth * ((dwRGBBit + 7) / 8);
if (nHeight <= 0)
{
nHeight = -nHeight;
switch (dwRGBBit)
{
case 15:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
UINT b = Trunc((y << 8) + n1) >> 11;
UINT g = Trunc((y << 8) + n2) >> 11;
UINT r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 10) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + n1) >> 11;
g = Trunc((y << 8) + n2) >> 11;
r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 10) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
case 16:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
UINT b = Trunc((y << 8) + n1) >> 11;
UINT g = Trunc((y << 8) + n2) >> 10;
UINT r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 11) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + n1) >> 11;
g = Trunc((y << 8) + n2) >> 10;
r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 11) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
case 24:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 6, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
pDest[j ] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) + n3) >> 8);
y = pSrc[k+2];
pDest[j+3] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+4] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) + n3) >> 8);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
case 32:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 8, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
pDest[j ] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) + n3) >> 8);
pDest[j+3] = 0;
y = pSrc[k+2];
pDest[j+4] = (BYTE) (Trunc((y << 8) + n1) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) + n2) >> 8);
pDest[j+6] = (BYTE) (Trunc((y << 8) + n3) >> 8);
pDest[j+7] = 0;
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
}
}
else
{
pDest += (nHeight - 1) * dwDestPitch;
switch (dwRGBBit)
{
case 15:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
UINT g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 11;
UINT r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 10) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 11;
r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 10) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
case 16:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
UINT g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 10;
UINT r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 11) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 11;
g = Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 10;
r = Trunc((y << 8) - u + 506 * v - 64522) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 11) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
case 24:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 6, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
pDest[j ] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
y = pSrc[k+2];
pDest[j+3] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+4] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
case 32:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 8, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
pDest[j ] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+1] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+2] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
pDest[j+3] = 0;
y = pSrc[k+2];
pDest[j+4] = (BYTE) (Trunc((y << 8) + 511 * u - 6 * v - 64522) >> 8);
pDest[j+5] = (BYTE) (Trunc((y << 8) - 125 * u - 255 * v + 48838) >> 8);
pDest[j+6] = (BYTE) (Trunc((y << 8) - u + 506 * v - 64522) >> 8);
pDest[j+7] = 0;
}
pSrc += dwSrcPitch;
pDest -= dwDestPitch;
}
}
break;
}
}
}
void YUV2RGB(BYTE *pDest,BYTE *pSrc,DWORD dwRGBBit,
DWORD dwDestPitch, DWORD dwSrcPitch,
int nHeight, UINT nWidth)
{
UINT nLength = nWidth * ((dwRGBBit + 7) / 8);
if (nHeight <= 0)
{
nHeight = -nHeight;
switch (dwRGBBit)
{
case 16:
{
for (UINT i = 0; i < (UINT) nHeight; i++)
{
for (UINT j = 0, k = 0; j < nLength; j += 4, k += 4)
{
UINT y = pSrc[k];
UINT u = pSrc[k+1];
UINT v = pSrc[k+3];
UINT n1=511*u-6*v-64522;
UINT n2=48838-125*u-255*v;
UINT n3=506*v-u-64522;
UINT b = Trunc((y << 8) + n1) >> 11;
UINT g = Trunc((y << 8) + n2) >> 10;
UINT r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j) = (WORD) ((r << 11) | (g << 5) | b);
y = pSrc[k+2];
b = Trunc((y << 8) + n1) >> 11;
g = Trunc((y << 8) + n2) >> 10;
r = Trunc((y << 8) + n3) >> 11;
*(WORD*)(pDest + j + 2) = (WORD) ((r << 11) | (g << 5) | b);
}
pSrc += dwSrcPitch;
pDest += dwDestPitch;
}
}
break;
}
}