Qt Quick 图像处理实例之美图秀秀(附源码下载)

本文通过一个图像处理应用展示了Qt Quick与C++混合编程的运用,详细介绍了如何使用QML和C++实现图像的柔化、灰度、浮雕、黑白、底片和锐化等特效。同时,提供了源码分析,包括ImageProcessor类和main.qml的实现,揭示了类似美图秀秀应用的底层原理。
摘要由CSDN通过智能技术生成

    在《Qt Quick 之 QML 与 C++ 混合编程详解》一文中我们讲解了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用,再来看一下 QML 与 C++ 混合编程的威力,同时也为诸君揭开美图秀秀、魔拍之类的相片美化应用的底层原理。

    项目的创建过程请参考《Qt Quick 之 Hello World 图文详解》,项目名称为 imageProcessor ,创建完成后需要添加两个文件: imageProcessor.h 和 imageProcessor.cpp 。

    本文是作者 Qt Quick 系列文章中的一篇,其它文章在这里:

实例效果

    先看一下示例的实际运行效果,然后我们再来展开。

    图 1 是在电脑上打开一个图片后的初始效果:


                  图 1 初始效果

    图 2 是应用柔化特效后的效果:

  

               图 2 柔化特效

    图 3 是应用灰度特效后的截图:


                   图 3 灰度特效

    图 4 是浮雕特效:


             图 4 浮雕特效

    图 5 是黑白特效:


                图 5 黑白特效

    图 6 是应用底片特效后的截图:


                  图 6 底片特效

    如果你注意到我博客的头像……嗯,木错,它就是我使用本文实例的底片特效做出来的。

    图 7 是应用锐化特效后的截图:


                  图 7 锐化特效

    特效展示完毕,那么它们是怎么实现的呢?这就要说到图像处理算法了。

图像处理算法

    imageProcessor 实例提供了"柔化"、"灰度"、"浮雕"、"黑白"、"底片"、"锐化"六种图像效果。算法的实现在 imageProcessor.h / imageProcessor.cpp 两个文件中,我们先简介每种效果对应的算法,然后看代码实现。

柔化

    柔化又称模糊,图像模糊算法有很多种,我们最常见的就是均值模糊,即取一定半径内的像素值之平均值作为当前点的新的像素值。

    为了提高计算速度,我们取 3 为半径,就是针对每一个像素,将周围 8 个点加上自身的 RGB 值的平均值作为像素新的颜色值置。代码如下:

static void _soften(QString sourceFile, QString destFile)
{
    QImage image(sourceFile);
    if(image.isNull())
    {
        qDebug() << "load " << sourceFile << " failed! ";
        return;
    }
    int width = image.width();
    int height = image.height();
    int r, g, b;
    QRgb color;
    int xLimit = width - 1;
    int yLimit = height - 1;
    for(int i = 1; i < xLimit; i++)
    {
        for(int j = 1; j < yLimit; j++)
        {
            r = 0;
            g = 0;
            b = 0;
            for(int m = 0; m < 9; m++)
            {
                int s = 0;
                int p = 0;
                switch(m)
                {
                case 0:
                    s = i - 1;
                    p = j - 1;
                    break;
                case 1:
                    s = i;
                    p = j - 1
  • 27
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

foruok

你可以选择打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值