现在的位置: 首页 > 综合 > 正文

Rgb2Yuv算法实现

2012年12月24日 ⁄ 综合 ⁄ 共 1196字 ⁄ 字号 评论关闭
  

void Rgb2Yuv(unsigned srcWidth,unsigned srcHeight,const BYTE* rgb,BYTE* yuv);
#define rgbtoy(b, g, r, y) y=(BYTE)(((int)30*r +(int)59*g +(int)11*b)/100)
#define rgbtoyuv(b, g, r, y, u, v) /
rgbtoy(b, g, r, y); /
u=(BYTE)(((int)-17*r -(int)33*g +(int)50*b+12800)/100); /
v=(BYTE)(((int)50*r -(int)42*g -(int)8*b+12800)/100)
 
void Rgb2Yuv ( unsigned srcWidth,unsigned srcHeight,const BYTE * rgb,BYTE * yuv )
{
     const unsigned planeSize = srcWidth*srcHeight;
     const unsigned halfWidth = srcWidth >> 1;
    
     BYTE * yplane  = yuv;
     BYTE * uplane = yuv + planeSize;
     BYTE * vplane = yuv + planeSize + (planeSize >> 2);
     const BYTE * rgbIndex = rgb;
    
     for (unsigned y = 0; y < srcHeight; y++)
     {
         BYTE * yline = yplane + (y * srcWidth);
         BYTE * uline = uplane + ((y >> 1) * halfWidth);
         BYTE * vline = vplane + ((y >> 1) * halfWidth);
          rgbIndex = rgb + (srcWidth*(srcHeight-1-y)*3);
    
         for (unsigned x = 0; x < srcWidth; x+=2)
         {
              rgbtoy(rgbIndex[0], rgbIndex[1], rgbIndex[2],*yline);
             
              rgbIndex += 3;
              yline++;
             
              rgbtoyuv(rgbIndex[0], rgbIndex[1],
              rgbIndex[2],*yline, *uline, *vline);
             
              rgbIndex += 3;
              yline++;
              uline++;
              vline++;
         }
     }
}

抱歉!评论已关闭.