QPixmap、QBitmap、QImage 與 QPicture

article/2025/10/21 6:44:40
在處理影像資料上,Qt提供了QPixmap、QBitmap、QImage與QPicture等類別。

一. 几种类的简介

QPixmap繼承了QPaintDevice,您可用以建立QPaint
er並於上進行繪圖,您也可以直接指定圖案載入Qt所支援的圖檔,
像是BMP、GIF、JPG、JPEG、PNG等,並使用QPainter的drawPixmap()繪製在其它的繪圖裝置上。您可以在QLabel、QPushButton上設定QPixmap以顯示圖像QPixmap是針對螢幕顯示圖像而設計並最佳化,依賴於所在平台的原生繪圖引擎,所以一些效果的展現(像是反鋸齒),在不同的平台上可能會有不一致的結果。

QBitmap是QPixmap的子類別,提供單色圖像,可用於製作游標(QCursor)或筆刷(QBrush)物件。下面的程式載入相同的圖檔,以觀看QPixmap與QBitmap的呈現效果:

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QBitmap>class PainterWidget : public QWidget {
protected:void paintEvent(QPaintEvent*);
};void PainterWidget::paintEvent(QPaintEvent *event) {QPixmap pixImg("caterpillar.jpg");QBitmap bitImg("caterpillar.jpg");QPainter painter(this);painter.drawPixmap(0, 0, pixImg);painter.drawPixmap(200, 0, bitImg);
}int main(int argc, char *argv[]) {QApplication app(argc, argv);PainterWidget pWidget;pWidget.setWindowTitle("QPixmap & QBitmap");pWidget.resize(400, 150);pWidget.show();return app.exec();
}

執行後的結果如下圖所示:



QPixmap使用平台的繪圖引擎,在不同的平台所呈現的效果不一,無法提供個別像素的存取,QImage使用Qt自身的繪圖引擎,可提供在不同平台上相 同的圖像呈現效果,並可透過setPixpel()、pixel()等方法,直接存取指定的像素,例如在Qt的QImage文件中,就有提供以下的範例:注意其中像素坐标的索引,和传统的OpenCV是不一样的。

QImage image(3, 3, QImage::Format_RGB32);QRgb value;value = qRgb(189, 149, 39); // 0xffbd9527image.setPixel(1, 1, value);value = qRgb(122, 163, 39); // 0xff7aa327image.setPixel(0, 1, value);image.setPixel(1, 0, value);value = qRgb(237, 187, 51); // 0xffedba31image.setPixel(2, 1, value);



QPicture則是個繪圖裝置,可以記錄並重播QPainter的繪圖指令,您可以使用QPainter的begin()方 法,指定在QPicture上進行繪圖,使用end()方法結束繪圖,使用QPicture的save()方法將QPainter所使用過的繪圖指令存至 檔案,例如:
QPicture picture;
QPainter painter;
painter.begin(&picture); 
painter.drawRect(10, 20, 100, 50);
painter.end();
picture.save("draw_record.pic");


要重播繪圖指令的話,建立一個QPicture,使用load()方法載入繪圖指令的檔案,然後在指定的繪圖裝置上繪製QPicture:

QPicture picture;
picture.load("draw_record.pic");  
QPainter painter;
painter.begin(this);
painter.drawPicture(0, 0, picture); 
painter.end(); 

二. QPixmap和QImage的区别

1. QPixmap是专门为绘图而生,当需要绘制图片时你需要使用QPixmap。QImage则是I/O,为图片像素访问以及修改而设计的。如果你想访问图片的像素或是修改图片像素,则需要使用QImage, 或者借助于QPainter来操作像素。
    另外跟QImage不同是,QPixmap跟硬件是相关的,如X11, Mac 以及 Symbian平台上,QPixmap 是存储在服务器端,而QImage则是存储在客户端,在Windows平台上,QPixmap和QImage都是存储在客户端,并不使用任何的GDI资源。
2. 相信大家更关心的是谁比较快,哈哈,现在来总结一下:在X11, Mac 以及 Symbian平台上,QImage: 因为它是存储在客户端,QImage上绘图比较快,但显示它则比较慢。QPixmap: 因为它是存储在服务器端,往QPixmap上绘图比较慢,
    但显示它则比较快。但在Windows平台上则是是一样的,因为它们都存储在客户端

三. QImage与QPixmap完全解析

1. 先让大家看两段代码:
QPixmap pixmap;
pixmap.load( ":/pics/earth.png" );
label->setPixmap( pixmap );
QPixmap pixmap;
pixmap.load( ":/pics/earth.png" );
QPainter painter(this);
painter.drawPixmap(0,0, pixmap);
看起来好像没什么问题啊。是的,在Windows操作系统上是没有问题的。问题是我们做的是Qt for Symbian! 手机上的资源本来就是比较紧缺的,所以我们使用的时候就需要更加注意。 
Qt 为我们提供了四个处理图像的类:QImage,QPixmap,QBitmap 和QPicture。其中前两个是最常使用的。
2. QPixmap依赖于硬件
设计之初QPixmap就是用来加速显示的,例如我们在paint的时候用QPixmap就会比用其他类的效果好许多。 当使用上述代码显示较小图片的时候(比如例子程序中的background.png 和apple.png)是没有问题的,图片都能在手机上正确显示。
但是当我们把图片换成一副较大图片287KB,1058 x 1058的“earth.png”的时候就出现问题了,图片无法显示,程序的界面是一片空白。据测算,“earth.png”被完全解码后存储在graphics memory中会占用大约4.3MB的空间。如果此时还有其他加载的窗口和QPixmap,很可能就没有空间了。

3. 正确的方法
        正确的方法应该先用 QImage获取图像,并且做一下预处理,然后再用QPixmap来加速显示。和QPixmap 不同,QImage是独立于硬件的,它可以同时被另一个线程访问。QImage是存储在客户端的,对QImage的使用是非常方便和安全的。 又由于 QImage 也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI 线程中处理,使用这一方式可以很大幅度提高UI响应速度。 因此当图片较大时,我们可以先通过QImage将图片加载进来,然后把图片缩放成需要的尺寸,最后转换成QPixmap 进行显示。正确的代码如下:
//correct and recommended way
QImage image;
image.load( ":/pics/earth.png" );QPainter painter(this);
QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::KeepAspectRatio) );
painter.drawPixmap(0,0, pixmapToShow);

第一图是显示效果(图片是按照earth.png的原始尺寸比例缩放后显示的),第二图的代码为:QPixmap pixmapToShow = QPixmap::fromImage( image.scaled(size(), Qt::IgnoreAspectRatio) ); 
  

下面便是第三图的实现代码,可以显示,一方面比较的慢,另外一方面只能显示部分。
//correct, some times may be needed
QImage image;
image.load( ":/pics/earth.png" );
QPainter painter(this);
painter.drawImage(0,0, image);



http://chatgpt.dhexx.cn/article/rbyNTaxr.shtml

相关文章

QPixmap使用scaled()函数缩放失败

因为需要&#xff0c;需要将QPixmap在控件上显示并进行缩放&#xff0c;将其缩放成与控件一般大&#xff1b; 但是发现并没有缩放成功&#xff08;见图一&#xff09;&#xff1b; 看下代码&#xff1a; QPixmap pixmap;if(pixmap.load(url)) {pixmap.scaled(width(), height…

QPixmap显示图片

我们来实现在窗口上显示图片&#xff0c;并将图片进行平移&#xff0c;缩放&#xff0c;旋转和扭曲。这里我是利用QPixmap类来实现图片显示的。 一、利用QPixmap显示图片。 1.将以前的工程文件夹进行复制备份&#xff0c;我们这里将工程文件夹改名为painter05。&#xff08;经…

QT绘制图像QImage-QPixmap-QBitmap-QPicture

QT绘制图像QImage-QPixmap-QBitmap-QPicture #ifndef MAINWINDOW10_8_H #define MAINWINDOW10_8_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow10_8; } QT_END_NAMESPACEclass MainWindow10_8 : public QMainWindow {Q_OBJECTpublic:MainW…

QT使用QLabel控件显示图片,报错:QPixmap::scaled: Pixmap is a null pixmap

Label 和 pushButton 两个控件 实现点击 按钮 标签显示图片的功能 槽函数如下 Widget.cpp 同级目录img中有图片 1.png 但是点击后报错&#xff1a;QPixmap::scaled: Pixmap is a null pixmap 在网上看了很多帖子&#xff1a; 文件名改为英文&#xff08;未解决问题&#xff09;…

图像处理QPixmap、Picture、QBitmap

QPixmap 类是一种可用作绘制设备的屏幕外图像表示形式。 QPixmap可以使用QLabel或QAbstractButton的子类之一可以轻松显示在屏幕上 QPixmap 对象可以按值传递&#xff0c;因为 QPixmap 类使用隐式数据共享&#xff0c;也可以流式传输。 QPixmap可以和QImage之间进行转换&…

基于Qt的QPixmap和Qimage实现无锯齿圆角图片设置

简述 开发环境&#xff1a;Window10&#xff0c;Qt 5.9.9 &#xff0c;mingw32 近期做的用来展示图片的软件&#xff0c;涉及到使用QLabel控件和QPixmap类来显示圆角图片。 查了一些资料&#xff0c;发现实现的基本步骤是&#xff1a; 1.读取图片。通过Qt中的QImage或Qpixmap…

PyQt5组件之QPixmap

QPixmap简介 QPixmap类用于绘图设备的图像显示&#xff0c;它可以作为一个QPainterDevice对象&#xff0c;也可以加载到一个控件中&#xff0c;通常是标签或者按钮&#xff0c;用于在标签或按钮上显示图像QPixmap可以读取的图像文件类型有BMP&#xff0c;GIF&#xff0c;JPG等…

QPixmap

一、描述 Qt 提供了四个用于处理图像数据的类&#xff1a; QImage 是为 I/O 以及直接像素访问和操作而设计和优化的。QPixmap 是为在屏幕上显示图像而设计和优化的。QBitmap是一个继承QPixmap的便利类&#xff0c;保证深度为1。如果QPixmap对象确实是位图&#xff0c;isQBitm…

【全奖博士】香港大学招收计算机视觉方向博士/博后/研究助理

来源&#xff1a;AI求职 香港大学 香港大学 (The University of Hong Kong)&#xff0c;简称港大 (HKU)&#xff0c;是一所国际化公立研究型大学&#xff0c;位于香港岛中西区&#xff0c;成立于 1911 年。在最新 QS 世界排名和泰晤士世界排名中&#xff0c;分别位列第 21 位和…

为什么有的计算机本科生就能发表顶会,但是许多博士生还是一篇都没有?

我知道知乎有很多大神本科生&#xff0c;也有很多普通的博士生。希望本科大佬不要看不起那些平庸博士&#xff0c;博士生也不要嫉妒本科大佬。大家尽量客观的分析问题。 本科生还有很多时间要上课&#xff0c;博士生全天科研而且有4,5年的时间。虽然能发顶会的本科生肯定是非常…

计算机专业博士阶段研究方向,国内计算机专业博士研究方向

国内计算机专业博士研究方向 国内计算机专业博士研究方向 学校名称 专业 研究方向 复旦大学 081202 计算机软件与理论 01数据库与知识库 02数字图书馆 03数据挖掘 04电子商务 05软件工程 06Web数据管理与数据挖掘 07对等(P2P) 计算技术 08流数据分析与管理 09智能信息处理 10算…

怎么学好数据结构?北大计算机博士亲授。

首先明确一下&#xff0c;为什么要学好数据结构&#xff1f;如果你是一位职场人士&#xff0c;那你肯定知道&#xff0c;工作中要用到数据结构的时候少之又少&#xff0c;所以很少会有职场人特意来学好数据结构。但是据我观察&#xff0c;这依然是有必要的。而且很多公司包括一…

计算机相关专业提升学历的解决方案(博士研究生)

文章目录 1、正规全日制博士1.1 申请 - 考核制1.2 硕博连读与直博 2、继续教育&#xff08;非全日制&#xff09;2.1 在职博士2.2 同等学力申博 3、海外博士3.1 海外博士3.2 中外合作博士 博士录取政策 国内博士&#xff0c;没有具体的政策&#xff0c;招生权力下放到各个高校。…

博士申请 | 香港大学计算机科学系黄超老师招收2022年入学全奖博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 香港大学 黄超老师将于 2021 年秋季加入香港大学&#xff08;University of Hong Kong-HKU&…

博士申请 | 加拿大阿尔伯塔大学韩杰教授招收电子与计算机专业博士/博后

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 阿尔伯塔大学 阿尔伯塔大学&#xff08;University of Alberta&#xff09;&#xff0c;始建…

我为什么鼓励你读计算机领域的博士?

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自 | 科研大叔 看过《水浒传》的朋友都知道&#xff0c;梁山的一百单八将因为各种理由加入了水寨&#xff0c;走上了劫富济贫、替天行道的路。我2006年从南京大学本…

博士申请 | 香港城市大学计算机学院徐伟涛老师组招收人工智能全奖博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 香港城市大学 香港城市大学是一所坐落于香港九龙塘的公立研究型大学。2023 年 QS 世界大学排…

博士申请 | 澳门大学张一博教授课题组招收计算机视觉方向全奖博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 澳门大学 澳门大学新校区位于美丽的珠海横琴岛&#xff0c;是澳门唯一的公立综合性大学&…

2022年中山大学计算机学院计算机考博申博博士经验分享

2022年中山大学计算机学院计算机考博申博博士经验分享 自己考博时候&#xff0c;得到了中山大学师兄的帮助&#xff0c;感觉非常感激&#xff0c;因此博士考完之后&#xff0c;我想将自己的考博经验与大家分享&#xff0c;中间或许有些问题记得不太清楚&#xff0c;各位同学朋…

博士申请 | 美国佛罗里达州立大学计算机系王广老师招收人工智能全奖博士生...

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 佛罗里达州立大学 佛罗里达州立大学&#xff08;Florida State University&#xff09;&…