Qt图像处理技术十一:得到QImage图像的马赛克图像

效果图

指数5

指数15

指数40

原理

马赛克的原理很简单,就是取一个值,让这个值作为一个方格子的长宽,如40*40px的格子,取这个区域的平均R G B值,然后这个区域的所有像素点都是这个RGB值即可

源码

cpp 复制代码
QImage applyMosaic(const QImage& oldImage, int blockSize) {
    if (oldImage.isNull() || blockSize <= 0) {
        return QImage(); // 返回空图片或处理错误
    }

    // 确保blockSize是偶数,并且不会使图像尺寸变得太小
    blockSize = (blockSize % 2 == 0) ? blockSize : blockSize + 1;
    if (oldImage.width() < blockSize || oldImage.height() < blockSize) {
        return oldImage; // 如果blockSize太大,直接返回原图
    }

    // 计算新图片的尺寸
    int newWidth = oldImage.width() / blockSize * blockSize;
    int newHeight = oldImage.height() / blockSize * blockSize;

    QImage newImage(newWidth, newHeight, oldImage.format());

    // 遍历每个块
    for (int y = 0; y < newHeight; y += blockSize) {
        for (int x = 0; x < newWidth; x += blockSize) {
            // 计算块的平均颜色
            QRgb averageColor = qRgb(0, 0, 0); // 初始化平均颜色为黑色
            int totalR = 0, totalG = 0, totalB = 0;
            int count = 0;

            for (int by = 0; by < blockSize && y + by < oldImage.height(); ++by) {
                for (int bx = 0; bx < blockSize && x + bx < oldImage.width(); ++bx) {
                    QRgb pixel = oldImage.pixel(x + bx, y + by);
                    totalR += qRed(pixel);
                    totalG += qGreen(pixel);
                    totalB += qBlue(pixel);
                    ++count;
                }
            }

            if (count > 0) { // 确保count不是0,避免除以0
                averageColor = qRgb(totalR / count, totalG / count, totalB / count);
            }

            // 用平均颜色填充整个块
            for (int by = 0; by < blockSize && y + by < newImage.height(); ++by) {
                for (int bx = 0; bx < blockSize && x + bx < newImage.width(); ++bx) {
                    newImage.setPixel(x + bx, y + by, averageColor);
                }
            }
        }
    }

    return newImage;
}
相关推荐
m0_59452630几秒前
基于 PyQt5 实现分组列表滚动吸顶效果
开发语言·python·qt
追烽少年x1 小时前
Qt 中的线程池QRunnable和QThreadPool
qt
艾思科蓝 AiScholar1 小时前
【SPIE出版,见刊快速,EI检索稳定,浙江水利水电学院主办】2025年物理学与量子计算国际学术会议(ICPQC 2025)
图像处理·人工智能·信息可视化·自然语言处理·数据分析·力扣·量子计算
cpp_learners10 小时前
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
qt·zlib·加密压缩·quazip
数巨小码人14 小时前
QT SQL框架及QSqlDatabase类
jvm·sql·qt
AAIshangyanxiu16 小时前
遥感与GIS在滑坡、泥石流风险普查中的实践技术应用
图像处理·遥感·dem数据·arcgis地质灾害·envi遥感
程序员老舅17 小时前
C++ Qt项目教程:WebServer网络测试工具
c++·qt·测试工具·webserver·qt项目·qt项目实战
enyp8018 小时前
Qt QStackedWidget 总结
开发语言·qt
luoyayun36118 小时前
Trae+Qt+MSVC环境配置
vscode·qt·环境配置·trae qt
小伍_Five20 小时前
从0开始:OpenCV入门教程【图像处理基础】
图像处理·python·opencv