Qt中的图像处理与绘制

文章目录

    • 1 图像处理与绘制
      • 1.1 QImage和QPixImage
      • 1.2 简单图像处理
      • 1.3 屏幕截图

1 图像处理与绘制

1.1 QImage和QPixImage

设备无关图像类-QImage:

  • 独立于具体硬件的图像类。
  • 主要用于读写图像文件,针对IO访问而设计。
  • 能够直接在像素级对图像进行处理。
    Qt中的图像处理与绘制_第1张图片

设备相关图像类-QPixmap:

  • 依赖于具体硬件的图像类。
  • 主要是用于绘图,针对屏幕显示而设计。
  • 显示效果依赖于所在平台的绘图引擎(不可移植)。

要点:

  • Qt图像类都继承自QPaintDevice。
  • QPainter能够直接在图像上绘制图形。
  • QImage和QPixmap能够相互转换。
    Qt中的图像处理与绘制_第2张图片

特殊技能:

  • QImage:
    • 读取图像文件,直接进行像素级别操作。
    • 内置简易图像处理相关算法。
  • QPixmap:
    • 最大限度利用硬件(显卡加速),增强图像显示效果。
    • 屏幕截图、窗口截图、组件截图。

1.2 简单图像处理

重置图像大小并灰度化:
Qt中的图像处理与绘制_第3张图片

#include 
#include 

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 屏幕截图

Qt中的图像处理与绘制_第4张图片
Widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

class Widget : public QWidget
{
    Q_OBJECT

    QPushButton 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 
#include 
#include 
#include 
#include 
#include 

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 
#include "Widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}


参考资料:

  1. QT实验分析教程

你可能感兴趣的:(所学所思所想)