首页 > 其他 > 详细

第69课 图像处理与绘制

时间:2016-12-29 23:01:48      阅读:343      评论:0      收藏:0      [点我收藏+]

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();
}
View Code

//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能够直接在图像对象上进行绘图

第69课 图像处理与绘制

原文:http://www.cnblogs.com/5iedu/p/6234847.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!