图像处理和绘制

在Qt中,可以对现有的图像进行处理,也可以对图形的显示进行设置。

一、设备无关、图像类——QImage:

特点:独立于具体硬件的图像类,主要用于读写图像文件,针对IO访问设计,并且能够在像素级别对图像进行处理。

我们先看一个实例:


左边是原图,右边是经过处理后的图像,首先对图形大小进行了改变,并且将所有的RGB颜色,全都转换为灰色。

实现代码如下:

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();
}
通过这个例子,可以看到QIamge类对图像的处理。

在Qt中,还有一种是与设备相关的类——QPixmap,它依赖于具体的硬件,主要用于绘图,针对屏幕的显示而设计,显示效果依赖于所在平台的绘图引擎。

两个类之间的关系如下:


QPainter能够直接在图像上在绘制图形,而这两个类也可以相互转换。

功能简介:QImage用于读取图像文件,直接进行像素级的操作,其内置了简单图形的处理算法;

QPixmap可以最大限度地利用硬件(显卡)加速,增强图像显示效果,并且用于常用的截图功能:屏幕截图(grabWindow())、窗口截图(grabWidget())、组建截图等。

我们通过一个综合实验来对这两个类进行使用:

设置一个窗口,分别实现图像文件读取和截屏功能;

设计分析:两个按钮,一个文件打开对话框,QImage用于对读取到的图像进行显示,QPixmap实现对屏幕的截取。

头文件代码如下:

    QPushButton m_loadBtn;
    QPushButton m_grabBtn;
    QPixmap m_pmap;
private slots:
    void onLoadBtnClicked();
    void onGrabBtnClicked();
protected:
    void paintEvent(QPaintEvent *);

实现代码:

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

实现效果如下:









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值