QT 三大绘图类:QPixmapQImageQPicture

QT 三大绘图类:QPixmapQImageQPicture,第1张

QPixmap 、 QImage 、 QPicture 都是 QPaintDevice 的子类。

QPixmap 的设计本来就是用来加速显示,用 paint 绘图时用 QPixmap 会比其他类的效果好很多。一般小用 QPixmap 。

QPixmap 也可以接受一个字符串作为一个文件的路径来显示这个文件,比如你想在程序之中打开 BMP、GIF、JPG、JPEG、PNG 等文件,就可以使用 QPixmap 。使用 QPainter 的 drawPixmap() 函数可以把这个文件绘制到一个 QLabel 、 QPushButton 或者其他的设备上面。 QPixmap 是针对屏幕进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是 *** 作系统提供的原生的绘图引擎。所以,在不同的 *** 作系统平台下, QPixmap 的显示可能会有所差别。 QPixmap 提供了静态的 grabWidget() 和 grabWindow() 函数,用于将自身图像绘制到目标上。同时,在使用 QPixmap 时,你可以直接使用传值也不需要传指针,因为 QPixmap 提供了“隐式数据共享”,即传递 QPixmap 不必须使用指针。

更多参考: QPixmap

QBitmap 继承自 QPixmap ,因此具有 QPixmap 的所有特性。 QBitmap 的色深始终为 1 色深这个概念来自计算机图形学,是指用于表现颜色的二进制的位数。我们知道,计算机里面的数据都是使用二进制表示的。为了表示一种颜色,我们也会使用二进制。比如我们要表示8种颜色,需要用 3 个二进制位,这时我们就说色深是 3 因此,所谓色深为 1,也就是使用 1 个二进制位表示颜色。1 个位只有两种状态:0 和 1,因此它所表示的颜色就有两种,黑和白。所以说, QBitmap 实际上是只有黑白两色的图像数据。由于 QBitmap 色深小,因此只占用很少的存储空间,所以适合制作游标( QCursor )或者笔刷( QBrush )。

既然依赖软件,那么就不需要用硬件 GUI 的线程了,可以开个软件的线程,可提高用户 UI 体验。

例子:

QImage 使用 Qt 自身的绘图引擎,可提供在不同平台上相同的图像呈现效果,并可通过 pixel() 、 setPixpel() 等方法直接存取和修改指定的像素。

QPicture 是一个绘画设备类,它记录了并可以重演 QPainter 的命令。你可以使用 QPainter 的 begin() 方法,指定在 QPicture 上绘图,使用 end() 方法结束绘图,使用 QPicture 的 save() 方法将 QPainter 所使用过的绘图指令存至档案。要重播绘图指令的话,建立一个 QPicture ,使用 load() 方法载入绘图指令的档案,然后在指定的绘图装置上绘制 QPicture 。

记录绘制的图形:

接着便可在您的绘图设备重画已经保存的图形:

更多参考: QPicture¶

QPixmap 跟硬件是相关的,如 X11, Mac 以及 Symbian 平台上, QPixmap 是存储在服务器端,而 QImage 则是存储在客户端,在 Windows 平台上, QPixmap 和 QImage 都是存储在客户端,并不使用任何的GDI资源。

在 X11, Mac 以及 Symbian 平台上,因为 QImage 是存储在客户端,往 QImage 上绘图比较快,但显示它则比较慢。因为 QPixmap 是存储在服务器端,往 QPixmap 上绘图比较慢,但显示它则比较快。但在 Windows 平台上则是是一样的,因为它们都存储在客户端。

QImage 是设计并优化来为 I/O *** 作的,可以直接访问和 *** 作像素,而 QPixmap 是设计并优化来在屏幕上显示的。 QBitmap 仅是继承自 QPixmap 的一个方便使用的类,是为了确保的深度为1。 QPicture 是绘图设备,可以用来重现 QPainter 命令。

自己写了一个代码但是显示有问题, 全部是 灰色的;

QImage image(pBuffer,800,600,QImage::Format_RGB888);

QPixmap pixmap = QPixmap::fromImage(image);

uipicLabel->resize(nWidth,nHeight);

uipicLabel->setGeometry(100,0,1000,700);

uipicLabel->setPixmap(pixmap);

1、如果你是从文件读,

那么直接用QImage或QPixmap的带有文件路径的构造函数构造一个对象,

然后用QLabel的setPixmap

2、如果你的图像已经存在内存中,你只是想进行如ARGB转换成灰度或是2值图像的话,

那么你可以用QImage的成员函数convertToFormat进行转换

其中第一个参数是一个枚举类型,表示的是你的图像类型,如8位的灰度类型或是RGB类型等

文档解释的很清楚,可以自己看。

注意一点就是QImage可以转换成QPimap,转换是很快的,浅引用里面的ImageData而已,详细内容你可以看源码,于是你就可以通过QLabel的setPixmap进行显示了

3、如果你是想通过字节自己变化,

那就直接通过QImage或是QPixmap的scanLine获取起始的字节指针

然后根据图像的宽度进行遍历就是,关于RGB和灰度转换的算法或是根据阈值转换2值图像的算法有很多,自己去研究吧。最后将你处理的设置到QLabel就行了

一点建议:如果你真要在Qt上做一些图像算子处理什么的,别用QLabel,QLabel是轻量级的,你最好是用GraphicsView-Scene-item这个去做

补充的问题回答:

你颜色空间都不一样,那就不能直接读了,你可以先将YUV的颜色空间转换成Rgb24的,Qt只支持HSV,HSL,CMYK,RGB这四种颜色空间。。

所以你自己先将该图像的字节流数据用文件流的方式读,然后根据颜色空间转换的算法转换成RGB24,然后可以根据你转换后的整个字节数组获得一个QImage或是QPixmap

继续补充:二值图就是1个像素是1位,不是很清楚你问的问题“如何知道二值图是24位或8位”,你能描述清楚点么,你要是不懂图像处理,就搞个PPT或是书研究下基础吧。

你要是有什么问题可以HI我…

以上就是关于QT 三大绘图类:QPixmap/QImage/QPicture全部的内容,包括:QT 三大绘图类:QPixmap/QImage/QPicture、如何在 Qt显示内存里的图像数据、QT4 如何在 QLabel 上显示二值图和灰度图 等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10148115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存