列举单色滤镜

1.暖色
2.冷色
3.反色
4.老照片
5.灰度

github代码(持续更新)

期待你的小星星
github:https://github.com/dependon/simple-image-filter //qt美颜滤镜

Bound函数,防止越界

int Bound(int range_left, int data, int range_right)
{
int index = data;
if (data > range_right) {
index = range_right;
} else if (data < range_left) {
index = range_left;
}
return index;
}

暖色滤镜

原理如下:
​ 这里红绿越高,颜色越暖,蓝色越高,图片色彩越冷,所以算法为红色和绿色按固定数值增加,蓝色不变。
red=red+30;
green=green+30;

QImage warnImage(const QImage &img, int index)
{
QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
}
QColor frontColor;
int size = img.width() * img.height(); for (int i = 0; i < size ; i++) {
int r = rgb[i * 3] + index;
int g = rgb[i * 3 + 1] + index;
int b = rgb[i * 3 + 2] ; rgb[i * 3] = r > 255 ? 255 : r;
rgb[i * 3 + 1] = g > 255 ? 255 : g;
rgb[i * 3 + 2] = b > 255 ? 255 : b;
} return imgCopy;
}

冷色滤镜


原理如下:
这里红绿越高,颜色越暖,蓝色越高,图片色彩越冷,所以算法为红色和绿色不变,蓝色增加30。
blue=blue+30

QImage coolImage(const QImage &img,  int index)
{ QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
}
QColor frontColor;
int size = img.width() * img.height(); for (int i = 0; i < size ; i++) {
int r = rgb[i * 3] ;
int g = rgb[i * 3 + 1] ;
int b = rgb[i * 3 + 2] + index; rgb[i * 3] = r > 255 ? 255 : r;
rgb[i * 3 + 1] = g > 255 ? 255 : g;
rgb[i * 3 + 2] = b > 255 ? 255 : b;
} return imgCopy;
}

灰度滤镜


原理如下:
​ 任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:
  1.浮点算法:Gray = R0.3 + G0.59 + B0.11
  2.整数方法:Gray = (R
299+G587+B114)/1000
  3.移位方法:Gray =(R28+G151+B*77)>> 8
  4.平均值法:Gray = (R+G+B)/3
  5.仅取绿色:Gray = G
  通过以上任何一种方法求得Gray后,将原来的RGB(r,g,b)中的r,g,b统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(r,g,b)就是灰度图了。
这里采用平均值算法和整数算法

//方案1
QImage GreyScale(const QImage &img)
{
QImage imgCopy; if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
int size = img.width() * img.height();
for (int i = 0; i < size ; i++) {
int average = (rgb[i * 3] * 299 + rgb[i * 3 + 1] * 587 + rgb[i * 3 + 1] * 114 + 500) / 1000;
rgb[i * 3] = average;
rgb[i * 3 + 1] = average;
rgb[i * 3 + 2] = average;
}
return imgCopy; }
//方案2 QImage QImageAPI::GrayScaleImage(const QImage &img)
{ QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
}
QColor frontColor;
int size = img.width() * img.height(); for (int i = 0; i < size ; i++) {
int average = (rgb[i * 3] + rgb[i * 3 + 1] + rgb[i * 3 + 2]) / 3;
rgb[i * 3] = average > 255 ? 255 : average;
rgb[i * 3 + 1] = average > 255 ? 255 : average;
rgb[i * 3 + 2] = average > 255 ? 255 : average;
}
return imgCopy;
}

老照片滤镜


原理如下:
该点red值 =0.393x该点red值+0.769x该点green值+0.189x该点blue值
该点green值 =0.349x该点red值+0.686x该点green值+0.168x该点blue值
该点blue值 =0.272x该点red值+0.534x该点green值+0.131x该点blue值
如果遇到超过255的情况,取最大值255

QImage oldImage(const QImage &img)
{
QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
} int size = img.width() * img.height();
for (int i = 0; i < size ; i++) {
float r = 0.393 * rgb[i * 3] + 0.769 * rgb[i * 3 + 1] + 0.189 * rgb[i * 3 + 2];
float g = 0.349 * rgb[i * 3] + 0.686 * rgb[i * 3 + 1] + 0.168 * rgb[i * 3 + 2];
float b = 0.272 * rgb[i * 3] + 0.534 * rgb[i * 3 + 1] + 0.131 * rgb[i * 3 + 2];
r = Bound(0, r, 255);
g = Bound(0, g, 255);
b = Bound(0, b, 255);
rgb[i * 3] = r;
rgb[i * 3 + 1] = g ;
rgb[i * 3 + 2] = b ;
}
return imgCopy;
}

反色滤镜

原理如下:
每个点的rgb色都变成
该点red值=255-该点red值;
该点green值=255-该点green值;
该点blue值=255-该点blue值;

QImage QImageAPI::InverseColorImage(const QImage &img)
{
QImage imgCopy;
if (img.format() != QImage::Format_RGB888) {
imgCopy = QImage(img).convertToFormat(QImage::Format_RGB888);
} else {
imgCopy = QImage(img);
}
uint8_t *rgb = imgCopy.bits();
if (nullptr == rgb) {
return QImage();
} int size = img.width() * img.height();
for (int i = 0; i < size ; i++) {
rgb[i * 3] = 255 - rgb[i * 3] ;
rgb[i * 3 + 1] = 255 - rgb[i * 3 + 1] ;
rgb[i * 3 + 2] = 255 - rgb[i * 3 + 2] ;
}
return imgCopy;
}

Qt图像处理技术二:对QImage图片简单滤镜(暖色,冷色,反色,老照片,灰度)的更多相关文章

  1. Python+OpenCV图像处理(二)——打印图片属性、设置图片存储路径、电脑摄像头的调取和显示

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的Python科学计算库 ...

  2. c语言数字图像处理(二):图片放大与缩小-双线性内插法

    图像内插 假设一幅大小为500 * 500的图像扩大1.5倍到750 * 750,创建一个750 * 750 的网格,使其与原图像间隔相同,然后缩小至原图大小,在原图中寻找最接近的像素(或周围的像素) ...

  3. GDI+图形图像处理技术中Pen和Brush的简单使用和简单图形的绘制(C#)

    1.Graphics Graphics对象是GDI+绘图表面,因此在Windows窗体应用程序中要使用GDI+创建绘图,必须要先创建Graphics.在给窗体注册一个Paint事件后,Graphics ...

  4. iOS摇一摇功能、震动功能、简单的摇动动画、生成二维码图片与发送短信等几个功能

    有一个开锁的功能,具体的需求就类似于微信的"摇一摇"功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最 ...

  5. iOS几个功能:1.摇一摇;2.震动;3.简单的摇动动画;4.生成二维码图片;5.发送短信;6.播放网络音频等

    有一个开锁的功能,具体的需求就类似于微信的“摇一摇”功能:摇动手机,手机震动,手机上的锁的图片摇动一下,然后发送开锁指令.需求简单,但用到了许多方面的知识. 1.摇一摇 相对这是最简单的功能了. 在v ...

  6. Qt开发技术:图形视图框架(二)场景QGraphicsScene、QGraphicsItem与QGraphicsView详解

    前话   Qt的图形视图框架,最核心的三个类为:QGraphicsScene.QGraphicsItem与QGraphicsView.   基于图形框架的高级白板软件Demo QGraphicsSce ...

  7. asp.net.web如何简单生成和保存二维码图片的例子

    首先,要有生成二维码图片,需要二维码生成的类库,到官网下载thoughtWorks.QRCode.dll 例子的步骤: 1.创建项目QRCodeTest1,选择asp.net.web窗体应用程序

  8. 搭建Android+QT+OpenCV环境,实现“单色图片着色”效果

               OpenCV是我们大家非常熟悉的图像处理开源类库:在其新版本将原本在Contrib分库中的DNN模块融合到了主库中,并且更新了相应文档.这样我们就能够非常方便地利用OpenCV实 ...

  9. HTML5图形图像处理技术研究

    摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...

  10. FPGA与数字图像处理技术

    数字图像处理方法的重要性源于两个主要应用领域: 改善图像信息以便解释. 为存储.传输和表示而对图像数据进行处理,以便于机器自动理解. 图像处理(image processing): 用计算机对图像进行 ...

随机推荐

  1. Flink学习(十六) ProcessFunctionAPI(底层API)

    我们之前学习的转换算子是无法访问时间的时间戳信息和水位线信息的.而这些在一些应用场景下,极为重要,例如MapFunction这样的map转换算子就无法访问时间戳或者当前事件的事件时间. 基于此,Dat ...

  2. 记一次Microsoft.Toolkit.Mvvm(MVVM Toolkit)的兼容性问题

    今天在目标框架为framework4.6.1的wpf项目中使用Microsoft.Toolkit.Mvvm7.1.1出现了一个比较怪异的编译时错误,前提是打开了 工具>选项>环境>预 ...

  3. HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘 🍕

    title: HTTP协议与RESTful API实战手册(二):用披萨店故事说透API设计奥秘 date: 2025/2/27 updated: 2025/2/27 author: cmdragon ...

  4. 什么是swagger,一篇带你入门

    一.前言 在前后端分离开发的过程中,前端和后端需要进行api对接进行交互,就需要一个api规范文档,方便前后端的交互,但api文档不能根据代码的变化发生实时动态的改变,这样后端修改了接口,前端不能及时 ...

  5. Content-Encoding:br 是一种什么编码格式?

    一.前言 在之前测试HTTP应答的压缩过程中无意间发现在Google浏览器下出现了 Content-Encoding:br 这种的编码格式,当时我就纳闷了,前面不是一直在研究GZip压缩吗?br压缩又 ...

  6. centos7下扩展根分区(图文详解)

    df -h    查看当前系统磁盘使用状况 fdisk -l    可以看见,我新添加了一块硬盘,大小为10G,新磁盘/dev/sdb fdisk /dev/sdb    对新的磁盘进行分区 在交互模 ...

  7. Git分支命名规范总结

    Git分支命名规范总结 在Git分支命名规范中,通常通过前缀明确区分需求(功能开发)和Bug修复,以下是具体规则及示例: 一.命名规范区分原则 需求分支(Feature) 前缀:feature/ 或 ...

  8. 国产化-内存数据库tendis-单机安装(完美替代redis)

    挺好的产品腾讯能开源还是体现了大厂的担当和格局,赞一个.阿里也开源了一些不错的产品后面讲. Tendis 介绍 Tendis 是腾讯公司开源的一款高性能分布式存储系统,基于 Redis 协议开发,具有 ...

  9. 【SpringCloud】SpringCloud Alibaba Sentinel实现熔断与限流

    SpringCloud Alibaba Sentinel实现熔断与限流 限流与降级 限流 blockHandler 降级 fallback 降级需要运行时出现异常才会触发,而限流一旦触发,你连运行的机 ...

  10. 【SpringMVC】表单标签 & 处理静态资源

    SpringMVC 表单标签 &处理静态资源 使用 Spring 的表单标签 • 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便 ...