把我的对YUV数据修改亮度,对比度,灰度的函数共享。色度研究当中。

HRESULT CPlay_Image::YUV420ConvertImage(UCHAR *pYUV,LONG lYUVWidth,LONG lYUVHeight,LONG lBrightness,LONG lColorfulness,LONG lContrast)
{
    UCHAR *pY = pYUV;
    UCHAR *pU = pYUV + lYUVWidth * lYUVHeight;
    UCHAR *pV = pYUV + lYUVWidth * lYUVHeight * 5 / 4;
   
    LONG width = ((lYUVWidth * 3 + 3) / 4) * 4;
   
    LONG uvHeight = lYUVHeight / 2;
    LONG uvWidth = lYUVWidth / 2;
    for (LONG i=0; i<lYUVHeight; i++)
    {
        LONG yi = lYUVHeight - 1 - i;
        LONG uvi = yi / 2;
        for (LONG j=0; j<lYUVWidth; j++)
        {
            LONG uvj = j / 2;
           
            UCHAR iY = *(pY + yi * lYUVWidth + j);
            UCHAR iU = *(pU + uvi * uvWidth + uvj);
            UCHAR iV = *(pV + uvi * uvWidth + uvj);
           
            //YUV转换为RGB
            DOUBLE dR = (iY+0) + 1.402*(iV-128);
            DOUBLE dG = (iY+0) - 0.344*(iU-128) - 0.714*(iV-128);
            DOUBLE dB = (iY+0) + 1.772*(iU-128);
           
            dR = min(max(0, dR), 255);
            dG = min(max(0, dG), 255);
            dB = min(max(0, dB), 255);

/************************************************************************/
/*          以下代码对亮度进行修改,修改完成重新计算YUV值               */
/************************************************************************/
            if(dR + lBrightness > 255)
            {
                dR = 255;
            }
            else if(dR + lBrightness < 0)
            {
                dR = 0;
            }
            else
            {
                dR += lBrightness;
            }

            if(dG + lBrightness > 255)
            {
                dG = 255;
            }
            else if(dG + lBrightness < 0)
            {
                dG = 0;
            }
            else
            {
                dG += lBrightness;
            }

            if(dB + lBrightness > 255)
            {
                dB = 255;
            }
            else if(dB + lBrightness < 0)
            {
                dB = 0;
            }
            else
            {
                dB += lBrightness;
            }

//以下三行是自己换算的公式,画面效果相差较大
//              UCHAR lY = UCHAR(iY - 0.108 * iV + lBrightness + 13.75744) + 1;
//              UCHAR lU = UCHAR(iU + 0.061 * iV -7.683) - 1;
//              UCHAR lV = UCHAR(1.076 * iV -9.761) - 1;

/************************************************************************/
/*                    以下代码对对比度进行修改                            */
/************************************************************************/
            FLOAT fContrast = (FLOAT)lContrast;
            fContrast = 1.0;

            dR = (dR - 127) * fContrast + 127;
            if(dR > 255)
            {
                dR = 255;
            }

            dG = (dG - 127) * fContrast + 127;
            if(dG > 255)
            {
                dG = 255;
            }

            dB = (dB - 127) * fContrast + 127;
            if(dB > 255)
            {
                dB= 255;
            }

/************************************************************************/
/*    以下代码把图像转换为灰色图像,不过数据量不变的情况下,似乎没什么意义*/
/*
            iY = UCHAR(0.299 * dR + 0.587 * dG + 0.114 * dB);
            dR = iY;
            dG = iY;
            dB = iY;
*/
/************************************************************************/

            //RGB转换为YUV
            iY = UCHAR(0.299 * dR + 0.587 * dG + 0.114 * dB);
            iU = UCHAR(0.564 * (dB - iY) + 128);
            iV = UCHAR(0.713 * (dR - iY) + 128);

            *(pY + yi * lYUVWidth + j) = iY;
            *(pU + uvi * uvWidth + uvj) = iU;
            *(pV + uvi * uvWidth + uvj) = iV;
        }
    }   
    return 0;
}

此函数是用来同时修改亮度,色度,对比度的。上边那个直接修改YUV的公式,是通过把YUV转换为RGB,RGB转换为YUV的公式换算出来的。算了两遍感觉出入还是很大。难道我取值不够精确?

这个函数的效率不高,我办公用的电脑CPU为 双核 E2140,CPU使用率在不调用此函数时播放单路图像为3%,使用此函数后播放单路图像猛增到30%。
要提高效率,其中一点应该把亮度和对比度放在一起计算,另一点是如果把亮度和对比度放在一起计算的话,把重复计算的东西抽出来。还有就是能够不转换成RGB值而至今对YUV数据进行修改,但至今我还没有找到这个公式,我自己的计算也有问题。

据说使用MMX,SSE2指令集能实现非常高效的媒体转换,还没有去研究过。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值