把我的对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
LONG yi = lYUVHeight - 1 - i;
LONG uvi = yi / 2;
for (LONG j=0;
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指令集能实现非常高效的媒体转换,还没有去研究过。
推荐阅读
- 布丽吉特,人生绝对的赢家
- 一个小故事,我的思考。
- 家乡的那条小河
- 进必趋|进必趋 退必迟,问起对 视勿移
- 死结。
- Y房东的后半生14
- 对称加密和非对称加密的区别
- 前任
- 对抗抑郁最好的方法
- Eddy小文