日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Qt中的图像处理与绘制

發(fā)布時(shí)間:2025/4/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt中的图像处理与绘制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 圖像處理與繪制
      • 1.1 QImage和QPixImage
      • 1.2 簡(jiǎn)單圖像處理
      • 1.3 屏幕截圖

1 圖像處理與繪制

1.1 QImage和QPixImage

設(shè)備無關(guān)圖像類-QImage:

  • 獨(dú)立于具體硬件的圖像類。
  • 主要用于讀寫圖像文件,針對(duì)IO訪問而設(shè)計(jì)。
  • 能夠直接在像素級(jí)對(duì)圖像進(jìn)行處理。

設(shè)備相關(guān)圖像類-QPixmap:

  • 依賴于具體硬件的圖像類。
  • 主要是用于繪圖,針對(duì)屏幕顯示而設(shè)計(jì)。
  • 顯示效果依賴于所在平臺(tái)的繪圖引擎(不可移植)。

要點(diǎn):

  • Qt圖像類都繼承自QPaintDevice。
  • QPainter能夠直接在圖像上繪制圖形。
  • QImage和QPixmap能夠相互轉(zhuǎn)換。

特殊技能:

  • QImage:
    • 讀取圖像文件,直接進(jìn)行像素級(jí)別操作。
    • 內(nèi)置簡(jiǎn)易圖像處理相關(guān)算法。
  • QPixmap:
    • 最大限度利用硬件(顯卡加速),增強(qiáng)圖像顯示效果。
    • 屏幕截圖、窗口截圖、組件截圖。

1.2 簡(jiǎn)單圖像處理

重置圖像大小并灰度化:

#include <QtCore/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(); }

1.3 屏幕截圖


Widget.h:

#ifndef WIDGET_H #define WIDGET_H#include <QtGui/QWidget> #include <QPushButton> #include <QPixmap>class Widget : public QWidget {Q_OBJECTQPushButton m_loadBtn;QPushButton m_grabBtn;QPixmap m_pmap;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 <QPainter> #include <QFileDialog> #include <QImage> #include <QMessageBox> #include <QApplication> #include <QDesktopWidget>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]) ){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 *) {QPainter painter;if( !m_pmap.isNull() ){painter.begin(this);painter.drawPixmap(0, 0, width(), height(), m_pmap);painter.end();} }Widget::~Widget() {}

main.cpp:

#include <QtGui/QApplication> #include "Widget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }

參考資料:

  • QT實(shí)驗(yàn)分析教程
  • 總結(jié)

    以上是生活随笔為你收集整理的Qt中的图像处理与绘制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。