• 21747阅读
  • 14回复

如何在一个Widget上显示yuv格式的图片 [复制链接]

上一主题 下一主题
离线think
 
只看楼主 倒序阅读 楼主  发表于: 2007-12-07
— 本帖被 XChinux 执行加亮操作(2007-12-10) —
如何在一个Widget上显示yuv格式的图片

QImage、QPixmap支持yuv格式的图片吗。
Qt3自带yuv到rgb转换的库函数吗。
谢谢
离线mxw5495
只看该作者 1楼 发表于: 2007-12-10
QImage可以由RGB32的数据构造,估计你要自己写yuv到RGB的函数了,我在论坛上找了个yuv到rgb的函数,不知道好不好用,你试试吧:
void yuv420_toRGB(int width, int height, unsigned char *buf,unsigned char* RGBBuffer)
{
        unsigned char *YBuffer = buf;
        unsigned char *UBuffer = buf + height * width;
        unsigned char *VBuffer = buf + (int)(height*width*1.25);
        int Y, U, V, R, G, B;
        int writePos = 0;
        int i = 0, j = 0;
        int k = 0;
        for(i=0; i<height; i++)
        {
                for(j=0; j<width; j++)
                {
                        Y = YBuffer[j]-16;
                        k = (int)(j/2);
                        U = UBuffer[k]-128;
                        V = VBuffer[k]-128;
                        R = ((298*Y + 409*V + 128)>>8);
                        G = ((298*Y - 100*U - 208*V + 128)>>8);
                        B = ((298*Y + 516*U + 128)>>8);
                        RGBBuffer[writePos++] = (B<0) ? 0 : ((B>255) ? 255 : B);
                        RGBBuffer[writePos++] = (G<0) ? 0 : ((G>255) ? 255 : G);
                        RGBBuffer[writePos++] = (R<0) ? 0 : ((R>255) ? 255 : R);
                        RGBBuffer[writePos++] = 0xff;
                }

                YBuffer += width;
                if(i%2==1)
                {
                        UBuffer += width/2;
                        VBuffer += width/2;
                }
        }

}
离线think
只看该作者 2楼 发表于: 2007-12-14
Thanks
不用加bmp的header吗?
离线mxw5495
只看该作者 3楼 发表于: 2007-12-17
应该是不用的,如果你需要把一帧图像存成一个文件时才需要加头的信息吧,直接显示的时候不用加头。
离线think
只看该作者 4楼 发表于: 2007-12-19
用QPaniter来draw吗?
如果用setPaletteBackgroundPixmap( ... )
似乎就要头吧。
我试过在不加头的时候
pixmap.loadFromData( buf, len, QString::null, QPixmap::Color );
总是fail,还是我的用法不对呢?
离线mxw5495
只看该作者 5楼 发表于: 2007-12-24
我是用QImage Image(data, width, height, QImage::Format_RGB32);由数据生成了qimage,再转成了QPixmap, QPixmap pixmap = QPixmap::fromImage(Image);然后画到了一个qlable上面:ui.loacalLabel->setPixmap(pixmap );你要画在Widget上的话可以在Widget上面加个lable吧
离线think
只看该作者 6楼 发表于: 2007-12-26
明白了,多谢。
看最后绘图的调用,和我上面的代码相似,
想来是QImage本身支持了yuv了。
离线dxzk7

只看该作者 7楼 发表于: 2008-10-14
QT 直接支持YUV的覆盖? 请教一下怎么实现。谢谢
离线wyu_yantu
只看该作者 8楼 发表于: 2009-07-17
    请问一下,谁会在QT Widget上显示YUV了?请说一下
离线sdspp
只看该作者 9楼 发表于: 2009-08-14
顶起来。。。。。

我也遇到了同样的问题,即使按照mxw5495 给的步骤,将yuv转为rgb然后再render到widget上,得到是乱码的图片而已。

有谁知道具体的做法吗,说一下啊。
离线duduqq

只看该作者 10楼 发表于: 2009-08-14
我是再把rgb再转成bmp,然后再把bmp的数据用QImage::loadFromData加载到image上,再画到界面上
离线tcg1983

只看该作者 11楼 发表于: 2009-10-10
您好,请问你已经实现了一个YUV文件在QT上的显示吗?用QImage可以吗? 我用的是SDL 但我想用QT内部类实现,请问能把你实现的关键部分代码 让我参考下吗?
离线tcg1983

只看该作者 12楼 发表于: 2009-10-10
可以根据mxw5495 的方法实现,这个YUV转BMP的函数因为是可以用的,谢谢了。
离线singser
只看该作者 13楼 发表于: 2010-05-05
thank you very much ! I have found it a long time !
离线fishscaleyu
只看该作者 14楼 发表于: 2010-11-22
same as singer~!
快速回复
限100 字节
 
上一个 下一个