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;    
		  } 
}