设备无关图像类 — QImage — 独立于具体硬件的图像类 — 主要用于读写图像文件,针对 IO 访问而设计 — 能够直接在像素级对图像进行处理
设备相关图像类 — QPixmap — 依赖于具体硬件的图像类 — 主要是用于绘图,针对屏幕显示而设计 — 显示效果依赖于所在平台的绘制引擎(不可移植)
Qt 图像类都继承自 QPaintDevice
QPainter能够直接在图像上绘制图形
Qlmage 和 QPixmap 能够相互转换
特殊技能 — Qlmage 读取图像文件,直接进行像素级操作 内置简易图像处理相关算法 — QPixmap 最大限度利用硬件(显卡)加速,增强图像显示效果 屏幕截图,窗口截图,组件截图…main.cpp
#include <QCoreApplication> #include <QImage> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QImage img; if(img.load("test.jpg")) { img = img.scaled(QSize(img.width()/2, img.height()/2)); for(int i = 0; i < img.width(); i++) { for(int j = 0; j < img.height(); j++) { QRgb rgb = img.pixel(i, j); int r = qRed(rgb); int g = qGreen(rgb); int b = qBlue(rgb); int gray = (r + g + b)/3; img.setPixel(i, j, qRgb(gray, gray, gray)); } } img.save("tt.jpg"); } return a.exec(); }
小贴士:
1、grabWindow() 用于对屏幕图像进行抓取 2、grabWidget() 用于对当前程序中的组件外观图像进行抓取widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPushButton> #include <QPixmap> class Widget : public QWidget { Q_OBJECT QPushButton m_loadBtn; QPushButton m_grabBtn; QPixmap m_pmap; protected slots: void onLoadBtnClicked(); void onGrabBtnClicked(); protected: void paintEvent(QPaintEvent* evt); public: Widget(QWidget *parent = 0); ~Widget(); }; #endif // WIDGET_Hwidget.cpp
#include "Widget.h" #include <QPainter> #include <QFileDialog> #include <QMessageBox> #include <QDesktopWidget> #include <QApplication> Widget::Widget(QWidget *parent): QWidget(parent) { m_loadBtn.setParent(this); m_loadBtn.move(10, 10); m_loadBtn.resize(70, 30); m_loadBtn.setText("Load"); m_grabBtn.setParent(this); m_grabBtn.move(90, 10); m_grabBtn.resize(70, 30); m_grabBtn.setText("Grab"); resize(500, 350); connect(&m_loadBtn, SIGNAL(clicked()), this, SLOT(onLoadBtnClicked())); connect(&m_grabBtn, SIGNAL(clicked()), this, SLOT(onGrabBtnClicked())); } void Widget::onLoadBtnClicked() { QFileDialog dlg(this); dlg.setAcceptMode(QFileDialog::AcceptOpen); dlg.setFileMode(QFileDialog::ExistingFile); if(dlg.exec() == QFileDialog::Accepted) { QImage img; if(img.load(dlg.selectedFiles()[0])) { m_pmap = QPixmap::fromImage(img); update(); } else { QMessageBox(QMessageBox::Critical, "Error", "Invalid image file!").exec(); } } } void Widget::onGrabBtnClicked() { m_pmap = QPixmap::grabWindow(QApplication::desktop()->winId()); update(); } void Widget::paintEvent(QPaintEvent* evt) { QPainter painter(this); if(!m_pmap.isNull()) { painter.drawPixmap(0, 0, width(), height(), m_pmap); } } Widget::~Widget() { }main.cpp
#include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }小结: 1、Qlmage 适用于直接进行图像处理的场合 2、QPixmap 适用于在界面上显示图像的场合 3、QPixmap 能够对Qlmage图像进行转换 4、QPainter 能够直接在图像对象上进行绘图