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

时间: 2024-11-09 12:44:27

QT使用QgraphicView/Qpainter展示RGB/YUV图像的相关文章

Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别

Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值:而"U"和"V"表示的则是色度(Chrominance或Chroma)2 1.3. HSB 和 HSV 是是一样的,只是叫法不同,HSL 则还有一些细微的区别:2 2. RGB 是对机器很友好的色彩模式,但

iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像

iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像 本文档基于H.264的解码,介绍读写Video Toolbox解码回调函数参数CVImageBufferRef中的YUV或RGB数据的方法,并给出CVImageBufferRef生成灰度图代码.方便调试.同时,还介绍了Video Toolbox解码回调中进行YUV处理时容易忽略的问题.文档定位于iOS音视频高级编程,致力于提供高参考价值的Core Video中文资料,最近也在StackO

RGB/YUV/YCbCr--关于显示,颜色你需要了解的一些事

本文来自:我爱研发网(52RD.com) - R&D大本营 详细出处:http://www.52rd.com/Blog/Detail_RD.Blog_SHRDFresh_64107.html 工作中常听说RGB/YUV/YCbCr 这样一些名词,概念上似乎很混淆?这里是一个简介,部分内容来自wiki,理解不对的地方欢迎指正. A:首先两个基本概念: Color model和Color Space. 1. Color Model: 为了表达人眼观察到的颜色,人们从数学模型上定义了一系列不同的col

最简单的视音频播放演示样例7:SDL2播放RGB/YUV

===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频播放演示样例2:GDI播放YUV, RGB 最简单的视音频播放演示样例3:Direct3D播放YUV,RGB(通过Surface) 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture) 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV 最简单的视音频播放演示样例

RGB, YUV及相关标准

最近在一次排查问题的过程中发现色彩空间及色彩空间转换也有很多技术细节,而理清这些细节能帮助我们更准确的定位视频方面的问题. 1. 色彩空间 色彩空间一词源于英文的“Color Space”,色彩学中,人们建立了多种色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种用坐标系统来定义的色彩范围即色彩空间. 例如计算机监视器上显示颜色的时候,通常使用 RGB(红色.绿色.蓝色)色彩空间定义,红色.绿色.蓝色被当作 X.Y 和 Z坐标轴.另外一个生成同样颜色的方法是使用色相(X 轴).饱和

最简单的视音频播放示例4:OpenGL播放RGB/YUV

本文记录OpenGL播放视频的技术.OpenGL是一个和Direct3D同一层面的技术.相比于Direct3D,OpenGL具有跨平台的优势.尽管在游戏领域,DirectX的影响力已渐渐超越OpenGL并被大多数PC游戏开发商所采用,但在专业高端绘图领域,OpenGL因为色彩准确,仍然是不能被取代的主角. OpenGL简介 从网上搜集了一些有关OpenGL简介方面的知识,在这里列出来.开放图形库(英语:Open Graphics Library,缩写为OpenGL)是个定义了一个跨编程语言.跨平

RGB 与 (RGB转 YCbCr再转为 RGB)的图像

RGB 与 (RGB转 YCbCr再转为 RGB)的图像   不可逆,可以从 矩阵的逆运算看出来. 附上 matlab 代码: clc,clear; Source=imread('1.jpg');%读入原始RGB图像 figure(1); subplot(1,2,1); imshow(Source):title('original image');%显示图像 [r c d]=size(Source);%计算图像大小 %------计算红色分量并显示分解图------% R(:,:,1)=Sour

Linux音视频(YUV图像数据格式)

摄像头图像数据的主流封装格式是JPEG/MJPG/YUV等,这些都是经过编码压缩的数据,大大减少了图像尺寸,方便传输和存储. 拓展: YUV是视频图像数据的主流格式,它根据人类眼睛的视觉特征设计--由于人类的眼睛对亮度的敏感度比颜色要高许多,而且在RGB三原色中对绿色有尤为敏感,利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点. YUV三个字母中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值,而"U"和"V"表示

基于YUV图像的色彩调节

目标:针对YUV格式的图像,直接给UV分量添加固定的偏移量,以便考察UV对整体颜色影响程度. 代码: #!/usr/bin/python #coding:utf-8 import cv2 import numpy as np def cb(): pass if __name__ == "__main__": img = cv2.imread("test.jpg") assert img is not None, "test.jpg can not be o