c语言如何实现将一张RGB的图片转化为YUV

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言如何实现将一张RGB的图片转化为YUV相关的知识,希望对你有一定的参考价值。

请各位朋友帮忙解决一下,最好加上注释。谢谢~~~

参考技术A http://www.vckbase.com/document/viewdoc/?id=1780
刚好也在网上看到有

C语言实现RGB packet格式转YUV(NV21)格式

前言:

此函数用于RGB packet(R G B R G B······)格式转YUV的NV21格式,保存NV21图像的内存由外部申请并传入。函数的具体实现原理在这里不做介绍,对RGB格式和YUV格式不熟悉的请自行查阅资料,该函数可直接拷贝过去使用。

代码:

/*
* 输入:data--RGB的数据
* 	w--RGB图像的宽
* 	h--RGB图像的高
* 输出:yuv--转换得到的yuv数据
*/
void RgbToNv12(Uint8* data, Uint32 w, Uint32 h, Uint8* yuv)
{
    Uint32 row_bytes;
    Uint8* uv;
    Uint8* y;
    Uint8 r, g, b;
    Uint8 y_val, u_val, v_val;
   
    Uint8 * img;
    Uint32 i, j;
    y = yuv;
    uv = yuv + w * h;

    row_bytes = (w * 3 );  
    h = h & ~1;
    //先转换Y
    for (i = 0; i < h; i++)
    {   
        img = data + row_bytes * i;
        for (j = 0; j <w; j++)
        {
            r = *(img+3*j);
            g = *(img+3*j+1);
            b = *(img+3*j+2);
            if(r>=254&&g>=254&&b>=254)
            {
    	        y_val=254;
    	        *y++ = y_val;
   	        continue;
            }
           y_val = (Uint8)(((int32)(299 * r) + (int32)(597 * g) + (int32)(114 * b)) / 1000);
           *y++ = y_val;
        }
    }
    //转换uv  
    for (i = 0; i <h; i += 2)
    {
	img = data + row_bytes*(h-i-1);
 	for (j = 0; j < w; j+=2)
  	{
	    r = *(img+3*j);
	    g = *(img+3*j+1);
	    b = *(img+3*j+2);
	    u_val= (Uint8)(((int32)(-168.7 * r) - (int32)(331.3 * g) + (int32)(500 * b) + 128000) / 1000);
	    v_val= (Uint8)(((int32)(500 * r) - (int32)(418.7 * g) - (int32)(81.3 * b) + 128000) / 1000);
	    *uv++ = v_val;
	    *uv++ = u_val;
	}
   }
}	         

以上是关于c语言如何实现将一张RGB的图片转化为YUV的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现BMP格式转RGB格式YUV格式

如何将rgb 模式转换成 yuv 模式

PAL或者NTSC制式 BT.656(YUV 4:2:2) 转化为BMP格式图片(RGB)算法

怎样用C语言实现图片的RGB颜色空间向Lab颜色空间的转化??

如何将摄像头采集的YUV图像数据保存成图片

C语言实现RGB packet格式转YUV(NV21)格式