将 Yuv420 转换为 rgb 并在 qt pixmap 上显示
Posted
技术标签:
【中文标题】将 Yuv420 转换为 rgb 并在 qt pixmap 上显示【英文标题】:Convert Yuv420 to rgb and show on qt pixmap 【发布时间】:2012-11-28 02:18:32 【问题描述】:我想将 yuv 图片转换为 RGB 以显示在 QT 像素图上。我现在看到的是一个空的像素图。
int convertYUVtoRGB(int y, int u, int v)
int r,g,b;
r = y + (int)(1.402f*v);
g = y - (int)(0.344f*u +0.714f*v);
b = y + (int)(1.772f*u);
r = r>255? 255 : r<0 ? 0 : r;
g = g>255? 255 : g<0 ? 0 : g;
b = b>255? 255 : b<0 ? 0 : b;
return 0xff000000 | (b<<16) | (g<<8) | r;
unsigned char * convertYUV420_NV21toRGB8888(unsigned char data[78080], int width, int height)
int size = width*height;
int offset = size;
unsigned char * pixels = new unsigned char[size];
int u, v, y1, y2, y3, y4;
// i percorre os Y and the final pixels
// k percorre os pixles U e V
for(int i=0, k=0; i < size; i+=2, k+=2)
y1 = data[i ]&0xff;
y2 = data[i+1]&0xff;
y3 = data[width+i ]&0xff;
y4 = data[width+i+1]&0xff;
u = data[offset+k ]&0xff;
v = data[offset+k+1]&0xff;
u = u-128;
v = v-128;
pixels[i ] = convertYUVtoRGB(y1, u, v);
pixels[i+1] = convertYUVtoRGB(y2, u, v);
pixels[width+i ] = convertYUVtoRGB(y3, u, v);
pixels[width+i+1] = convertYUVtoRGB(y4, u, v);
if (i!=0 && (i+2)%width==0)
i+=width;
return pixels;
int main(int argc, char *argv[])
QApplication a(argc, argv);
unsigned char * buffer;
unsigned char * image = NULL;
QPixmap pixmap;
QImage img(320, 122, QImage::Format_ARGB32_Premultiplied);
img.fill(QColor(Qt::white).rgb());
ifstream is;
is.open ("bunny.yuv", ios::binary );
// is.seekg (0, ios::end);
// length = is.tellg();
// is.seekg (0, ios::beg);
buffer = new unsigned char[78081];
is.read((char * )buffer,78080);
is.close();
/*
for (int x = 0; x < 10; ++x)
for (int y = 0; y < 10; ++y)
img.setPixel(x, y, qRgb(0, 0, 0));
*/
for(int i = 0; i < 78080; i++)
qDebug() << buffer[i]<< endl;
image = convertYUV420_NV21toRGB8888(buffer,320,122);
QByteArray byteImage((const char *)image);
pixmap.loadFromData(byteImage);
QLabel myLabel;
myLabel.setPixmap(pixmap);
myLabel.setGeometry(20,100,320,122);
myLabel.show();
return a.exec();
编辑:我添加了正确的格式和括号。还是同样的问题。 亲切的问候,
【问题讨论】:
【参考方案1】:当您在 Jason 的帖子中完成计算后 - 像素图的最佳格式是 QImage::Format_ARGB32_Premultiplied - 格式是 Blue byte Green byte Red byte 0xff
【讨论】:
添加了正确的格式,但仍然是同样的问题。修改了代码。【参考方案2】:这不会像你想象的那样做:
r = y + (int)1.402f*v;
g = y - (int)(0.344f*u +0.714f*v);
b = y + (int)1.772f*u;
由于您错过了括号,因此在计算之前将浮点常量转换为整数。
然后将您的 YUV 数据转换为 RGB 并打包到一个 int 中,然后将该 int 存储到一个 char 中...
所以:
unsigned char * pixels = new unsigned char[size];
应该是:
unsigned int* pixels = new unsigned int[size];
显然这也会影响函数的返回类型。您可能还想将 YUV -> RGB 函数的类型也更改为无符号,以保持一致性。
【讨论】:
【参考方案3】:在convertYUV420_NV21toRGB8888
中,pixels
是一个无符号字符数组,但您正试图为其分配一个int
。您将得到的只是低字节,并且输出中的大部分字节都将保持未设置。您需要完全重新考虑编写输出的方式。
【讨论】:
以上是关于将 Yuv420 转换为 rgb 并在 qt pixmap 上显示的主要内容,如果未能解决你的问题,请参考以下文章