您的位置:首页 > 其它

yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。

2015-04-28 16:35 399 查看
为了方便提取YUV数据,扫描一帧图像分1,3,5,7,9...........奇数行

和0,2,4,6,8...偶数行。

转换算法是从 http://www.fourcc.org/fccyvrgb.php 中找到,失败了呀!!!!!

图像一看就不对,唉,搞了好几天了,谁来帮忙试一下呀。



void MainWindow::paintEvent(QPaintEvent *e)

{

QPainter tPainter(this);

tPainter.drawText(10,50,"hello");

QString tYUVFile("/home/shell.albert/project/H.264/football/fb001.yuv");

QFile tFile(tYUVFile);

if(!tFile.open(QIODevice::ReadOnly))

{

qDebug()<<"open file failed!";

return;

}

QByteArray tYData=tFile.read(84480);

QByteArray tUData=tFile.read(21120);

QByteArray tVData=tFile.read(21120);

QByteArray tRestData=tFile.readAll();

qDebug()<<"Y:"<<tYData.size();

qDebug()<<"U:"<<tUData.size();

qDebug()<<"V:"<<tVData.size();

qDebug()<<"Rest:"<<tRestData.size();

QImage tImage(352,240,QImage::Format_RGB32);

qint32 tYUVWidth=tImage.width();

#if 1

//1,3,5,7..................

for(qint32 i=1;i<tImage.height();i+=2)

{

for(qint32 j=0;j<tImage.width();j++)

{

qint32 x=i-1;

qint32 y=j;

qint32 tYOffset=x*tYUVWidth+y;

qint32 tUOffset=(x/2)*(tYUVWidth/2)+y/2;

qint32 tVOffset=(x/2)*(tYUVWidth/2)+y/2;

qDebug("1,3,5,7:(%d,%d):%d,%d,%d",i,j,tYOffset,tUOffset,tVOffset);

qint32 tYValue=tYData.at(tYOffset);

qint32 tUValue=tUData.at(tUOffset);

qint32 tVValue=tVData.at(tVOffset);

qint32 tRed=tYValue+1.403*tVValue;

qint32 tGreen=tYValue-0.344*tUValue-0.714*tVValue;

qint32 tBlue=tYValue+1.770*tUValue;

tRed=tRed>255?255:tRed<0?0:tRed;

tGreen=tGreen>255?255:tGreen<0?0:tGreen;

tBlue=tBlue>255?255:tBlue<0?0:tBlue;

tImage.setPixel(j,i,qRgb(tRed,tGreen,tBlue));

}

}

#endif

#if 0

//0,2,4,6,8...............

for(qint32 i=0;i<tImage.height();i+=2)

{

for(qint32 j=0;j<tImage.width();j++)

{

qint32 x=i;

qint32 y=j;

qint32 tYOffset=x*tYUVWidth+y;

qint32 tUOffset=(x/2)*(tYUVWidth/2)+y/2;

qint32 tVOffset=(x/2)*(tYUVWidth/2)+y/2;

qDebug("0,2,4,6:(%d,%d):%d,%d,%d",i,j,tYOffset,tUOffset,tVOffset);

qint32 tYValue=tYData.at(tYOffset);

qint32 tUValue=tUData.at(tUOffset);

qint32 tVValue=tVData.at(tVOffset);

qint32 tRed=1.164*(tYValue-16)+1.596*(tVValue-128);

qint32 tGreen=1.164*(tYValue-16)-0.813*(tVValue-128)-0.391*(tUValue-128);

qint32 tBlue=1.164*(tYValue-16)+2.018*(tUValue-128);

tRed=tRed>255?255:tRed<0?0:tRed;

tGreen=tGreen>255?255:tGreen<0?0:tGreen;

tBlue=tBlue>255?255:tBlue<0?0:tBlue;

tImage.setPixel(j,i,qRgb(tRed,tGreen,tBlue));

}

}

#endif

tPainter.drawImage(0,0,tImage);

tYData.resize(0);

tUData.resize(0);

tVData.resize(0);

}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: