Qt图像处理与绘制(QImage和QPixmap)

1、图像处理与绘制 

设备无关图像类 - QImage

       -独立于具体硬件的图像类 

       -主要用于读写图像文件,针对IO访问而设计 

       -能够直接在像素级对图像进行处理 

设备相关图像类 - QPixmap

       -依赖于具体硬件的图像类 

       -主要是用于绘图,针对屏幕显示而设计 

       -显示效果依赖于所在平台的绘制引擎(不可移植) 

Qt图像类都继承自QPaintDevice QPainter能够直接在图像上绘制图形 

Qlmage 和 QPixmap 能够相互转换 

   Qt图像处理与绘制(QImage和QPixmap)_第1张图片

特殊技能 

       -Qlmage

              • 读取图像文件,直接进行像素级操作 

              • 内置简易图像处理相关算法 

       -QPixmap 

              • 最大限度利用硬件(显卡)加速,增强图像显示效果

              • 屏幕截图,窗口截图,组件截图,。。。 

 

小贴士:

       -grabWindow() 用于对屏幕图像进行抓取

       -grabWidget() 用于对当前程序中的组件外观图像进行抓取

编程实验 

重置图像大小并灰度化 main.cpp

#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

Qt图像处理与绘制(QImage和QPixmap)_第2张图片

编程实验 

屏幕截图后灰度化处理 

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()
{
    
}

Qt图像处理与绘制(QImage和QPixmap)_第3张图片

Qlmage适用于直接进行图像处理的场合 ,QPixmap适用于在界面上显示图像的场合 

QPixmap能够对Qlmage图像进行转换 ,QPainter能够直接在图像对象上进行绘图 

 

你可能感兴趣的:(QT【笔记】)