QPixmap 理论总结
- 一、概述
- 二、读写 Image 文件
- 三、Pixmap 像素图信息
- 四、Pixmap 格式转换
- 五、Pixmap 像素转换
一、概述
QPixmap 也是一个用得很多的描述图像的类,也是界面显示相关的时候用得很多的。
QPixmap类是一个可以用作绘画设备的屏幕外图像表示。Qt提供了四个类来处理图像数据:QImage, QPixmap, QBitmap和QPicture。QImage是为I/O和直接的像素访问和操作而设计和优化的,而QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap只是一个继承QPixmap的方便类,确保深度为1。如果QPixmap对象确实是位图,则isQBitmap()函数返回true,否则返回false。最后,QPicture类是一个绘图设备,用于记录和回放QPainter命令。
使用 QLabel 或 QAbstractButton 的子类之一(如 QPushButton 和 QToolButton )可以很容易地在屏幕上显示 QPixmap。QLabel 有一个像素图属性,而 QAbstractButton 有一个图标属性。
QPixmap对象可以按值传递,因为QPixmap类使用隐式数据共享。有关更多信息,请参阅隐式数据共享文档。QPixmap对象也可以流式传输,也就是可以序列化,这个类也是Qt默认支持序列化的一个类。
注意,像素图中的像素数据是内部的,由底层窗口系统管理。因为QPixmap是QPaintDevice的子类,QPainter可以用来直接在像素图上绘图。像素只能通过QPainter函数或将QPixmap转换为QImage来访问。但是,fill()函数可用于初始化具有给定颜色的整个像素图,其实就是填充图像嘛。
有一些函数可以在QImage和QPixmap之间转换。通常,QImage类用于加载图像文件,在QImage对象转换为要在屏幕上显示的QPixmap之前,可以选择操作图像数据。或者,如果不需要任何操作,则可以将图像文件直接加载到QPixmap中。
QPixmap提供了一组函数,可用于获取有关像素图的各种信息。此外,还有几个函数可以实现像素图的转换。
二、读写 Image 文件
QPixmap提供了几种读取图像文件的方法:文件可以在构造QPixmap对象时加载,也可以稍后使用 load() 或 loadFromData() 函数加载。在加载映像时,文件名可以引用磁盘上的实际文件,也可以引用应用程序的一个嵌入式资源。有关如何在应用程序的可执行文件中嵌入图像和其他资源文件的详细信息,请参阅Qt资源系统概述。
只需调用 save() 函数来保存QPixmap对象。
QPixmap pixmap;
QByteArray bytes;
QBuffer buffer(&bytes);
buffer.open(QIODevice::WriteOnly);
pixmap.save(&buffer, "PNG"); // writes pixmap into bytes in PNG format
支持的文件格式的完整列表可通过 QImageReader::supportedImageFormats() 和 QImageWriter::supportedImageFormats() 函数获得。新的文件格式可以作为插件添加。
默认情况下,Qt支持以下格式,在save()函数的时候可以传递这些名称:
格式 | 描述 | Qt的支持情况 |
---|---|---|
BMP | Windows Bitmap | Read/write |
GIF | Graphic Interchange Format (optional) | Read |
JPG | Joint Photographic Experts Group | Read/write |
JPEG | Joint Photographic Experts Group | Read/write |
PNG | Portable Network Graphics | Read/write |
PBM | Portable Bitmap | Read |
PGM | Portable Graymap | Read |
PPM | Portable Pixmap | Read/write |
XBM | X11 Bitmap | Read/write |
XPM | X11 Pixmap | Read/write |
三、Pixmap 像素图信息
QPixmap提供了一组函数,可以用来获取关于像素图的各种信息:
- Geometry 几何
size(), width()和height()函数提供有关像素图大小的信息。函数的作用是:返回图像的外围矩形。 - alpha 信息
如果像素图具有alpha通道的格式,则 hasphachannel() 返回 true,否则返回 false。hasAlpha(), setMask() 和 mask() 函数是遗留的,不应该使用。它们可能非常缓慢。createHeuristicMask()函数为这个像素图创建并返回一个1-bpp的启发式掩码(即一个QBitmap)。它的工作原理是从一个角落选择一种颜色,然后从所有的边缘开始,削去该颜色的像素。createMaskFromColor()函数根据给定的颜色为像素图创建并返回一个掩码(即QBitmap)。 - 低层次的信息
depth()函数的作用是:返回像素图的深度。defaultDepth() 函数返回默认深度,即应用程序在给定屏幕上使用的深度。
cacheKey()函数返回一个唯一标识QPixmap对象内容的数字。
四、Pixmap 格式转换
QPixmap对象可以使用toImage()函数转换为 QImage。同样,QImage也可以使用 fromImage() 转换为 QPixmap。
如果这个操作太麻烦,你可以使用 QBitmap::fromImage()代替。
要将 QPixmap 转换为HICON或从HICON转换,可以分别使用 QtWinExtras 函数 QtWin::toHICON() 和 QtWin::fromHICON()。
五、Pixmap 像素转换
QPixmap支持许多用于创建新像素图的函数,该像素图是原始像素图的转换版本:
其实就是一些缩放,在给一些控件设置图标的时候,使用这些函数就显得非常有必要
scaled(), scaledToWidth()和scaledToHeight() 函数返回缩放后的像素图副本,而 copy() 函数创建的QPixmap是原始像素图的普通副本。
scaled()函数的定义如下:
QPixmap QPixmap::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
使用 aspectRatioMode 和 transformMode指定的纵横比和转换模式,将像素图缩放到给定的大小。
- 如果aspectRatioMode为Qt::IgnoreAspectRatio,则像素图缩放到大小。
- 如果aspectRatioMode是Qt::KeepAspectRatio,像素图被缩放到尽可能大的矩形内部大小,保留长宽比。
- 如果aspectRatioMode是Qt:: keepaspectratiobyexpansion,像素图被缩放成一个尽可能小的矩形,保持长宽比。
如果给定的大小为空,则此函数返回空像素图。
在某些情况下,使用比例设置来绘制像素图比缩放像素图更有益。例如,当Painter基于OpenGL或比例因子快速变化时,就会出现这种情况。
transform()函数返回用给定的变换矩阵和变换模式变换的像素图的副本:在内部,变换矩阵被调整以补偿不需要的转换,即transforms()返回包含原始像素图的所有变换点的最小像素图。
静态truemmatrix()函数返回用于转换像素图的实际矩阵。