1. 设备无关和设备相关图像类
(1)设备无关图像类—QImage
①独立于具体硬件的图像类
②主要用于读写图像文件,针对IO访问而设计
③能够直接在像素级对图像进行处理
(2)设备相关图像类—QPixmap
①依赖于具体硬件的图像类
②主要是用于绘图,针对屏幕显示而设计,只能存在于内存中。
③显示效果依赖于所在平台的绘图引擎(不可移植)
2. 类继承图
(1)Qt图像类都继承自QPaintDevice
(2)QPainter能够直接在图像上绘制图形
(3)QImage和QPixmap能够相互转换
3. 特殊技能
类 |
功能 |
QImage |
①读取图像文件,直接进行像素级操作 ②内置简易图像处理相关算法 |
QPixmap |
①最大限度利用硬件(显卡)加速,增强图像显示效果 ②屏幕截图、窗口截图、组件截图、…… |
【编程实验】图像灰化处理
//69-1.pro
QT += core #QT -= gui //注意,该行注释了! CONFIG += c++11 TARGET = 69-1 CONFIG += console CONFIG -= app_bundle TEMPLATE = app SOURCES += main.cpp
//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("new.jpg"); } return a.exec(); }
4. 截图功能的实现
(1)获取窗口ID:WId wid = QApplication::desktop()->winId();
(2)截图函数
①grabWindow():用于对屏幕图像进行抓取
②grabWidget():用于对当前程序中的组件外观图像进行抓取
【编程实验】图像绘制与屏幕截图的实现
//main.cpp
#include "Widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
//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; //QPixmap用于图像的显示,QImage用于图像的存储和处理 private slots: void onLoadBtnClicked(); void onGrabBtnClicked(); protected: void paintEvent(QPaintEvent *); public: Widget(QWidget *parent = 0); ~Widget(); }; #endif // WIDGET_H
//Widget.cpp
#include "Widget.h" #include <QApplication> #include <QDesktopWidget> #include <QPainter> #include <QMessageBox> #include <QFileDialog> #include <QImage> 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 fd(this); fd.setAcceptMode(QFileDialog::AcceptOpen); fd.setFileMode(QFileDialog::ExistingFile); if( fd.exec() == QFileDialog::Accepted ) { QImage img; if( img.load(fd.selectedFiles()[0]) ) { //将QImage转为QPixmap以便于显示 m_pmap = QPixmap::fromImage(img); update(); } else { //为了代码简洁,直接调用构造函数生成一个临时对象,再调用其exec()函数 QMessageBox(QMessageBox::Critical, "Error", "Invalid image file!").exec(); } } } void Widget::onGrabBtnClicked() { m_pmap = QPixmap::grabWindow(QApplication::desktop()->winId()); update(); } void Widget::paintEvent(QPaintEvent *) { QPainter painter; if( !m_pmap.isNull() ) { painter.begin(this); //QPainter也封装了drawImage函数 painter.drawPixmap(0, 0, width(), height(), m_pmap); painter.end(); } } Widget::~Widget() { }
5. 小结
(1)QImage适用于直接进行图像处理的场合
(2)QPixmap适用于在界面上显示图像的场合
(3)QPixmap能够对QImage图像进行转换
(4)QPainter能够直接在图像对象上进行绘图
原文:http://www.cnblogs.com/5iedu/p/6234847.html