I420转RGB24

来源:互联网 发布:龙骑战歌gm数据 编辑:程序博客网 时间:2024/06/12 00:43

现在网上这些人写的要么不对 要么颜色溢出 要么偏黄 偏蓝  偏红 。真的是够了。


试一试下面就知道对不对了。

I420也叫IYUV,也叫YUV420 。 采集卡采集视屏数据通常为I420 经过转换成rgb24后 可以对图像进行各种处理。


下面来说说i420转rgb24:


   unsigned char*  I420ToRGBA(const  unsigned char * src, int width, int height)
  {
   
    //我的图片是1920*1080的  你们按照自己*3就可以
      unsigned char* rgbA = new unsigned char[1920*1080*3];
      int temp = 0;
            for(int i=0; i<height; i++){  
            int startY = i*width;   
            int step = (i/2)*(width/2);  
            int startV = positionOfV + step;  
            int startU = positionOfU + step;  


            for(int j = 0; j < width; j++){  
                int Y = startY + j;  
                int V = startV + j/2; 
                int U = startU + j/2;
                int index = Y*3;   

                temp = ((src[Y]&0xff) + 1.4075 * ((src[V]&0xff)-128));  
                rgbA[index+B] = temp<0 ? 0 : (temp > 255 ? 255 : temp);

                temp =  ((src[Y]&0xff) -  0.3455* ((src[U]&0xff)-128) - 0.7169*((src[V]&0xff)-128));
                rgbA[index+G] =   temp<0 ? 0 : (temp > 255 ? 255 : temp);

               temp =  ((src[Y]&0xff) +  1.779* ((src[U]&0xff)-128));  
                rgbA[index+R] =temp<0 ? 0 : (temp > 255 ? 255 : temp);
            }  
        }  

        return rgbA;  
  }


使用方法:

int main(void)

{

   

   // 参数1. 待转换的I420数据 ,参数二 图片宽度 ,参数三 图片的高度 ,返回值 :指向转换后的数据 也就是指向rgb24数据

   unsigned char* rgb24 =   I420ToRGBA(i420,1920,1080);

   return 0; 

}