QT 三大绘图类:QPixmap/QImage/QPicture

QPixmapQImageQPicture 都是 QPaintDevice 的子类。

QPixmap

依赖硬件、加速显示、适合小图片

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

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

更多参考:QPixmap

QBitmap

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

QImage

依赖软件,直接像素访问,适合大图片

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

例子:

image = QtGui.QImage(3, 3, QtGui.QImage.Format_RGB32)

value = QtGui.qRgb(189, 149, 39)  # 0xffbd9527
image.setPixel(1, 1, value)

value = QtGui.qRgb(122, 163, 39)  # 0xff7aa327
image.setPixel(0, 1, value)
image.setPixel(1, 0, value)

value = QtGui.qRgb(237, 187, 51)  # 0xffedba31
image.setPixel(2, 1, value)

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

QPicture

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

记录绘制的图形:

picture = QPicture()
painter = QPainter()
painter.begin(picture)            # paint in picture
painter.drawEllipse(10,20, 80,70) # draw an ellipse
painter.end()                     # painting done
picture.save("drawing.pic")       # save picture

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

picture = QPicture()
picture.load("drawing.pic")           # load picture
painter = QPainter()
painter.begin(myImage)                # paint in myImage
painter.drawPicture(0, 0, picture)    # draw the picture at (0,0)
painter.end()                         # painting done

更多参考:QPicture¶

注意

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

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

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

你可能感兴趣的:(QT 三大绘图类:QPixmap/QImage/QPicture)