Qt获取一张图片的平均色(主色调)
这两天在一个小工具中想做一个图标的发光效果,用固定颜色做出来效果很丑,于是想到此方法,得到图标的主色调后,将颜色调亮,并设置为阴影颜色,从而达到类似发光的效果。
本文章主要在于得到一张图片的平均色,并为其设置亮度变化。
先查看最终效果图:
该程序先获取图片中平均色,再将窗口颜色设置为平均色,从而达到沉浸的效果。
具体实现
颜色是由RGB三元色构成的,red、green、blue每一项都是0-255的整数。
那么,如果我们得到一些在图片上均匀分布的点,再获取他们的rgb值,分别求出平均数后最终得到的结果便是平均色。
先介绍一些Qt提供的方法
//该方法用于获取Image图片中位于(x,y)位置的点的rgb值
QRgb QImage::pixel(int x, int y)
//该方法用于判断Image图片中位于(x,y)位置的点是否有效
bool QImage::valid(int x, int y)
这两个是这篇文章中必须用到的东西。
代码实现
QColor pixmapMainColor(QPixmap p, double bright) //p为目标图片 bright为亮度系数,为1则表示保持不变
{
int step=20; //步长:在图片中取点时两点之间的间隔,若为1,则取所有点,适当将此值调大有利于提高运行速度
int t=0; //点数:记录一共取了多少个点,用于做计算平均数的分母
QImage image=p.toImage(); //将Pixmap类型转为QImage类型
int r=0,g=0,b=0; //三元色的值,分别用于记录各个点的rgb值的和
for (int i=0;i<p.width();i+=step) {
for (int j=0;j<p.height();j+=step) {
if(image.valid(i,j)){ //判断该点是否有效
t++; //点数加一
QColor c=image.pixel(i,j); //获取该点的颜色
r+=c.red(); //将获取到的各个颜色值分别累加到rgb三个变量中
b+=c.blue();
g+=c.green();
}
}
}
return QColor(int(bright*r/t)>255?255:int(bright*r/t),
int(bright*g/t)>255?255:int(bright*g/t),
int(bright*b/t)>255?255:int(bright*b/t)); //最后返回的值是亮度系数×平均数,若超出255则设置为255也就是最大值,防止乘与亮度系数后导致某些值大于255的情况。
}
在需要计算的位置调用此函数即可。
Qt获取一张图片的平均色(主色调)的更多相关文章
- Qt获取屏幕分辨率
http://my.oschina.net/u/1255773/blog/159557 原 Qt获取屏幕分辨率 发表于1年前(2013-09-06 11:00) 阅读(546) | 评论(0) 3 ...
- Qt 获取usb设备信息 hacking
/************************************************************************** * Qt 获取usb设备信息 hacking * ...
- Thinkphp发布文章获取第一张图片为缩略图实现方法
正则匹配图片地址获取第一张图片地址 此为函数 在模块或是全局Common文件夹中的function.php中 /** * [getPic description] * 获取文本中首张图片地址 * @p ...
- Qt 获取文件夹下所有文件
Qt 获取文件夹下所有文件代码如下: QStringList getFileNames(const QString &path) { QDir dir(path); QStringList n ...
- 使用 Qt 获取 UDP 数据并显示成图片(2)
本文首发于 BriFuture 的 个人博客 在我的前一篇文章 使用 Qt 获取 UDP 数据并显示成图片 中,我讲了如何用 Python 模拟发送数据,如何在 Qt 中高效的接收 UDP 数据包并将 ...
- 使用 Qt 获取 UDP 数据并显示成图片
一个项目,要接收 UDP 数据包,解析并获取其中的数据,主要根据解析出来的行号和序号将数据拼接起来,然后将拼接起来的数据(最重要的数据是 R.G.B 三个通道的像素值)显示在窗口中.考虑到每秒钟要接收 ...
- Qt获取本机IP地址
Qt获取本机IP地址: Qt版本:4.8.6 #include <QtNetwork/QNetworkInterface.h> QString ipAddr; QList<QHost ...
- 手动修改ARM Linux的静态IP和用QT获取和修改IP
.vi /etc/network/interfaces # 找到“# Wired or wireless interfaces” .注释掉 iface eth0 inet dhcp 这是自动获取ip地 ...
- Qt获取时间戳作为图片名
Qt获取时间戳作为图片名 //保存图片 void SaveRealsenseImg() { QString picIndexName = dataSavePath; picIndexName.appe ...
随机推荐
- macOS启动Kafka
目录 kafka目录结构 先启动zookeeper 后启动kafka 创建topic 创建一个生产者 创建一个消费者 kafka目录结构 # kafka安装目录 /usr/local/Cellar/k ...
- 为什么要用Spring Boot?
什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而 ...
- 使用createrepo构建本地yum仓库
rpm包安装的时候会有很多软件会出现因为其他依赖包没有,而导致安装失败的情况.一般可以连接外网的时候我们直接使用 yum 进行安装,可以为我们解决依赖包关系,但是很多工作环境下是没有外网的,内网情况下 ...
- [实战]ASP.NET Padding Oracle信息泄露漏洞
前言 这个漏洞是很多年前的了,刚好碰到网站有这个漏洞,利用一下也记录一下.具体原理请搜索学习,反正我不会. 推荐看这里,写得很清楚:http://www.91ri.org/6715.html 工具 p ...
- 从一个想法看 FreeBSD 是商业化还是学院派
在某知名计算机网络论坛上我看到一个帖子,说自己想根据 FreeBSD 做一个移动的终端操作系统,就像安卓,苹果的 IOS 一样的. 逆向思维当初开发安卓的时候不可能没有考虑过 FreeBSD,因为无论 ...
- Solon 框架详解(十)- Solon 的常用配置
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- golang 矩阵乘法、行列式、求逆矩阵
package matrix import ( "math" "github.com/astaxie/beego" ) type Matrix4 struct ...
- 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解
文章转载自:微信公众号「机器学习炼丹术」 作者:炼丹兄(已授权) 作者联系方式:微信cyx645016617(欢迎交流共同进步) 本次的内容主要讲解NCCNormalized cross-correl ...
- Ignatius and the Princess III HDU - 1028
题目传送门:https://vjudge.net/problem/HDU-1028 思路:整数拆分构造母函数的模板题 1 //#include<bits/stdc++.h> 2 #incl ...
- codefoces D. Phoenix and Science
原题链接:https://codeforc.es/problemset/problem/1348/D 题意:给你一个体重为一克的细菌(它可以每天进行一次二分裂即一分为二体重均分:晚上体重增加1克)求最 ...