QT使用QgraphicView/Qpainter展示RGB/YUV图像

本文记载说明使用Qt做RGB的渲染流程和问题。笔者认为:做媒体渲染这种数据量大而对象少的应用场景,使用Qpainter更佳,在多种RGB的转换中,YUV转RGB565最小而且字节对齐问题不容易发生,故推荐之。



加入与opengl  ddraw sdl 的 对比。


RGB->QImage->QPixMap->Scene->GrapView



图像的数据是以字节为单位保存的,每一行的字节数必须是4的整数倍,不足的补0。
(因为我们使用的是32操作系统,因此数据是按照32位对齐的,所以每行的字节数必须是4的整数倍也就是说每行的数据位必须是32位的整数倍。)这里是按照我的理解的,貌似错了,修正一下,最近在看数据对齐,这段话先忽略了,没有删掉,是因为,想留个足迹,等我找到合适的答案再贴上来。不过,图像的数据确实是按32位对齐的。
如果不是整数倍,则根据公式: W = ( w * bitcount + 31 )/32 * 4;
注:  w是图像的宽度,bitcount是图像的位深,即32、24等, 计算得到的W是程序中图像每行的字节数。
这里讲述QImage的32、24、8位图。
图像格式:QImage::Format_RGB32 ,QImage::Format_RGB888,QImage::Format_Indexed8。
构造图像:
    (1)、QImage myImage1 = QImage(filename);  根据文件名打开图像,如果图像本身是32、24位的,程序中图像是32位的,如果图像本身是8位、1位的,程序中对应为8位、1位。
   (2)、QImage myImage2 = QImage(width, height, QImage::Format_…); 根据图像宽高来构造一幅图像,程序会自动根据图像格式对齐图像数据。


参考代码:

	int bytePerLine=(nPlayWidth*24+31)/8;//图像每行字节对齐

	unsigned char* graydata=new unsigned char[bytePerLine*height];//存储处理后的数据

	/*修改相应图像数据graydata*/

	m_scene->clear();
	
	QImage *grayImg=new QImage(graydata,nPlayWidth,nPlayHeight,bytePerLine,QImage::Format_RGB888);
	m_scene->addPixmap(QPixmap::fromImage(*grayImg));

此外RGB565的渲染如下:


		QImage *tmp_img=new QImage((uchar *)m_ImgPtr,m_width,m_height,QImage::Format_RGB16);
	    m_painter->drawImage(*m_point,*tmp_img);





参考文章:

QT 绘图设备和Graphics View Framework

http://www.oschina.net/question/234345_48854

QImage 图像格式小结

http://tracey2076.blog.51cto.com/1623739/539690/

用StretchDIBits显示到PictureBox上倾斜

http://bbs.csdn.net/topics/300245493

灰度图像用SetPixel可以正常显示,StretchDIBits画出的图像倾斜

http://blog.csdn.net/zhongjling/article/details/7583376

QImage对一般图像的处理

http://www.cnblogs.com/Romi/archive/2012/12/03/2800039.html



你可能感兴趣的:(qt,QPainter,色彩转换,RGBYUV)