YUV转RGB汇总

本文档详细介绍了YUV格式的多种变种,并提供了从YUV到RGB32的转换代码实现,包括YUY2、YV12、UYVY等格式,解决了颜色转换中的错误问题。
摘要由CSDN通过智能技术生成
#region ******************彩色图像记录的格式,YUV 转 RGB******************

        /* YUV, http://zh.wikipedia.org/wiki/YUV#.E5.B8.B8.E7.94.A8.E7.9A.84YUV.E6.A0.BC.E5.BC.8F
         *  作为视频媒体类型的辅助说明类型(Subtype),它们对应的GUID如下:
         *  在DirectShow中,常见的RGB和YUV格式
            GUID                                格式描述
            MEDIASUBTYPE_RGB1                       2色,每个像素用1位表示,需要调色板
            MEDIASUBTYPE_RGB4                       16色,每个像素用4位表示,需要调色板
            MEDIASUBTYPE_RGB8                       256色,每个像素用8位表示,需要调色板
            MEDIASUBTYPE_RGB565                     每个像素用16位表示,RGB分量分别使用5位、6位、5位
            MEDIASUBTYPE_RGB555                     每个像素用16位表示,RGB分量都使用5位(剩下的1位不用)
            MEDIASUBTYPE_RGB24                      每个像素用24位表示,RGB分量各使用8位
            MEDIASUBTYPE_RGB32                      每个像素用32位表示,RGB分量各使用8位(剩下的8位不用)
            MEDIASUBTYPE_ARGB32                     每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)
         *
            MEDIASUBTYPE_YUY2                    YUY2格式,以4:2:2方式打包
            MEDIASUBTYPE_YUYV                    YUYV格式(实际格式与YUY2相同)
            MEDIASUBTYPE_YVYU                    YVYU格式,以4:2:2方式打包
            MEDIASUBTYPE_UYVY                    UYVY格式,以4:2:2方式打包
            MEDIASUBTYPE_AYUV                    带Alpha通道的4:4:4 YUV格式
            MEDIASUBTYPE_Y41P                    Y41P格式,以4:1:1方式打包
            MEDIASUBTYPE_Y411                    Y411格式(实际格式与Y41P相同)
            MEDIASUBTYPE_Y211                    Y211格式
            MEDIASUBTYPE_IF09                    IF09格式
            MEDIASUBTYPE_IYUV                    IYUV格式
            MEDIASUBTYPE_YV12                    YV12格式
            MEDIASUBTYPE_YVU9                    YVU9格式
         */


        #region RGB TO RGB32

        /* RGB32 */
        /// <summary>
        /// 根据指针地址及内存块长度,获取RGB32数组
        /// @20140516
        /// </summary>
        /// <param name="pBuffer"></param>
        /// <param name="lBufferSize"></param>
        /// <param name="lPicWidth"></param>
        /// <param name="lPicHeight"></param>
        /// <returns></returns>
        public static byte[] GetRgb32_FromIntptr(IntPtr pBuffer, Int32 lBufferSize, Int32 lPicWidth, Int32 lPicHeight)
        {
            // 设置数组大小
            byte[] rgba32 = new byte[lPicHeight * lPicWidth * 4];
            Marshal.Copy(pBuffer, rgba32, 0, lBufferSize);

            return rgba32;
        }

        #endregion


        #region YUV TO RGB32

        /// <summary>
        /// YUV 转 RGB32
        /// </summary>
        /// <param name="pYPlaneByte"></param>
        /// <param name="pVPlaneByte"></param>
        /// <param name="pUPlaneByte"></param>
        /// <param name="lPicHeight"></param>
        /// <param name="lPicWidth"></param>
        /// <param name="bError">是否存在错误</param>
        /// <param name="strErrorDesc">错误消息</param>
        /// <returns></returns>
        public static byte[] GetRgb32_From_Yuv(byte[] pYPlaneByte, byte[] pUPlaneByte, byte[] pVPlaneByte, Int32 lPicHeight, Int32 lPicWidth, ref bool bError, ref string strErrorDesc)
        {
            bError = true;
            strErrorDesc = "无错误";
            int picSize = lPicWidth * lPicHeight;

            byte[] pRrgaByte = new byte[picSize * 4];
            int A = 0;

            try
            {
                for (int iRow = 0; iRow < lPicHeight; iRow++)
                {
                    for (int jCol = 0; jCol < lPicWidth; jCol++)
                    {
                        //int Y = pYPlane[i * dwWidth + j];
                        //int U = pUPlane[(i / 2) * (dwWidth / 2) + (j / 2)];
                        //int V = pVPlane[(i / 2) * (dwWidth / 2) + (j / 2)];
                        //int R = Y + (U - 128) + (((U - 128) * 103) >> 8);
                        //int G = Y - (((V - 128) * 88) >> 8) - (((U - 128) * 183) >> 8);
                        //int B = Y + (V - 128) + (((V - 128) * 198) >> 8);
                        //R = max(0, min(255, R));
                        //G = max(0, min(255, G));
                        //B = max(0, min(255, B));

                        int Y = pYPlaneByte[iRow * lPicWidth + jCol];
                        int U = pUPlaneByte[(iRow / 2) * (lPicWidth / 2) + (jCol / 2)];
                        int V = pVPlaneByte[(iRow / 2) * (lPicWidth / 2) + (jCol / 2)];

                        /* 存在颜色转换错误问题。现象&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值