uwp 用win2d获取图片主调颜色
win10在设置颜色里有个从“背景图片中选取一种主题颜色”的选项,还有在很多内容展示软件中都使用了这样的功能。
现在我们需要在 nuget 引用 win2d.uwp 和 Toolkit.uwp 两个库。
首先将一个图片流转换成 win2d 的 CanvasBitmap 对象,然后通过 CanvasBitmap 的 GetPixelColors 方法获取到图片的全部颜色数组。
/// <summary>
/// 通过stream获取主题色
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
public async Task<Color> GetPaletteImage(IRandomAccessStream stream)
{ //实例化资源
var bimap = await CanvasBitmap.LoadAsync(device , stream);
//取色
Color[] colors = bimap.GetPixelColors();
return await GetThemeColor(colors);
}
在拿到整个颜色数组后我们需要计算出 平均亮度,平均饱和度,和平均色相
foreach (var item in colors)
{
//将 rgb 转换成 hsv 对象
HsvColor hsv = Microsoft.Toolkit.Uwp.Helpers.ColorHelper.ToHsv(item); //先将黑色和白色剔除掉
if (hsv.V < 0.3 || hsv.S < 0.2)
{
continue;
}
//找出最大饱和度
maxS = hsv.S > maxS ? hsv.S : maxS;
//找出最大亮度度
maxV = hsv.V > maxV ? hsv.V : maxV;
//找出最大色相
maxH = hsv.H > maxH ? hsv.H : maxH;
//色相总和
sumHue += hsv.H;
//亮度总和
sumS += hsv.S;
//饱和度总和
sumV += hsv.V;
count++;
notBlackWhite.Add(item); }
double avgV = sumV / count;
double avgS = sumS / count;
double maxAvgV = maxV / 2;
double maxAvgS = maxS / 2;
double maxAvgH = maxH / 2;
//计算各个值,用来做判断用
double h = Math.Max(maxAvgV, avgV);
double s = Math.Min(maxAvgS, avgS);
double hue = Math.Min(maxAvgH, avgH);
已经将需要做判断的值求出来后,我们将 剔除了白色和黑色的 数据在做一遍计算,符合条件的颜色相加在一起 再 将总和除以符合条件的数量。
foreach (var item in notBlackWhite)
{
HsvColor hsv = Microsoft.Toolkit.Uwp.Helpers.ColorHelper.ToHsv(item);
//颜色大于平均色相 并且 饱和度大于平局饱和度 并且 亮度大于平局亮度 的符合条件 进行相加
if (hsv.H >= hue + && hsv.V >= h && hsv.S >= s)
{
R += item.R;
G += item.G;
B += item.B;
count++;
}
}
double r = R / count;
double g = G / count;
double b = B / count;
color = Color.FromArgb(255, (byte)r, (byte)g, (byte)b);
右边为图片的主题颜色,可以看到这张图片的大部分颜色为黑色,而当我们看到这张图片的时候我们的注意力就却会被蓝色吸引住,我们在计算中并不是找到出现最多次的颜色为主题颜色,而是亮度和饱和度最为突出的作为主题色。
全部代码:
using Microsoft.Graphics.Canvas;
using Microsoft.Toolkit.Uwp;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.UI; namespace uwp_播放器.Data
{
public class ImageThemeBrush
{
CanvasDevice device = new CanvasDevice(); /// <summary>
/// 通过Uri获取主题色
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
public async Task<Color> GetPaletteImage(Uri uri)
{
//实例化资源
var bimap = await CanvasBitmap.LoadAsync(device, uri); //取色
Color[] colors = bimap.GetPixelColors();
return await GetThemeColor(colors);
} /// <summary>
/// 通过stream获取主题色
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
public async Task<Color> GetPaletteImage(IRandomAccessStream stream)
{ //实例化资源
var bimap = await CanvasBitmap.LoadAsync(device , stream); //取色
Color[] colors = bimap.GetPixelColors();
return await GetThemeColor(colors); } #region Methon:方法 private async Task<Color> GetThemeColor(Color[] colors)
{
Color color = new Color(); await Task.Run(() =>
{
//饱和度 黑色多
double sumS = ;
//明亮度 白色多
double sumV = ;
double sumHue = ;
//颜色中最大亮度
double maxV = ;
//颜色中最大饱和度
double maxS = ;
//颜色中最大色相
double maxH = ;
double count = ;
List<Color> notBlackWhite = new List<Color>();
foreach (var item in colors)
{
//将 rgb 转换成 hsv 对象
HsvColor hsv = Microsoft.Toolkit.Uwp.Helpers.ColorHelper.ToHsv(item); //先将黑色和白色剔除掉
if (hsv.V < 0.3 || hsv.S < 0.2)
{
continue;
}
//找出最大饱和度
maxS = hsv.S > maxS ? hsv.S : maxS;
//找出最大亮度度
maxV = hsv.V > maxV ? hsv.V : maxV;
//找出最大色相
maxH = hsv.H > maxH ? hsv.H : maxH;
//色相总和
sumHue += hsv.H;
//亮度总和
sumS += hsv.S;
//饱和度总和
sumV += hsv.V;
count++;
notBlackWhite.Add(item); } double avgH = sumHue / count;
double avgV = sumV / count;
double avgS = sumS / count;
double maxAvgV = maxV / ;
double maxAvgS = maxS / ;
double maxAvgH = maxH / ; //计算各个值,用来做判断用
double h = Math.Max(maxAvgV, avgV);
double s = Math.Min(maxAvgS, avgS);
double hue = Math.Min(maxAvgH, avgH); //aveS = aveS ;
double R = ;
double G = ;
double B = ;
count = ; foreach (var item in notBlackWhite)
{
HsvColor hsv = Microsoft.Toolkit.Uwp.Helpers.ColorHelper.ToHsv(item);
//颜色大于平均色相 并且 饱和度大于平局饱和度 并且 亮度大于平局亮度 的符合条件 进行相加
if (hsv.H >= hue + && hsv.V >= h && hsv.S >= s)
{
R += item.R;
G += item.G;
B += item.B;
count++;
}
} double r = R / count;
double g = G / count;
double b = B / count; color = Color.FromArgb(, (byte)r, (byte)g, (byte)b); }); colors = null; return color;
}
#endregion
}
}
uwp 用win2d获取图片主调颜色的更多相关文章
- php 获取图片主要颜色的方法
本文章向码农们介绍php 获取图片主要颜色的方法,主要涉及php针对图片的相关操作技巧,需要的码农可以参考一下. $i = imagecreatefromjpeg("image.jpg&qu ...
- PHP获取图片主题颜色
(1)工具类:pictureColor.php class pictureColor{ /** * 获取颜色使用库类型 */ public $type = 'gd'; ...
- php 提取图片主要颜色
PHP实现获取图片颜色值的方法 PHP获取图片颜色值检测图片主要颜色是通过imagecreatefromjpeg函数读取图片,再循环获得各个颜色值加以计算实现的. /** * 获取图片主要颜色 * @ ...
- cocos2d-x 获取图片的某像素点的RGBA颜色 -转
cocos2d-x 获取图片的某像素点的RGBA颜色 原文:http://www.cnblogs.com/jaoye/archive/2013/02/19/2916501.html 没做过 太多的图 ...
- [Swift通天遁地]五、高级扩展-(5)获取互补色、渐变色、以及图片主题颜色
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 通过分析HSL/HSB获取图片主色调
这两天稍微研究了一下颜色的HSL/HSB值,主要因为写程序想要实现通过一张图片拿到图片中的最突出的颜色值(类似Groove Music中播放栏背景就是从专辑封面中取出主色调,还有Windows 10任 ...
- UWP应用载入SVG图片的兼容性方案
原文 UWP应用载入SVG图片的兼容性方案 新版本<纸书科学计算器>的更新点之一,就是优化了表达式的显示方式.在旧版本中,表达式里的符号是用png图片显示的,当用户放大看的时候会发现一些锯 ...
- Atitit 动态按钮图片背景颜色与文字组合解决方案
Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...
- Android5.0新特性——图片和颜色(drawable)
图片和颜色 tint属性 tint属性一个颜色值,可以对图片做颜色渲染,我们可以给view的背景设置tint色值,给ImageView的图片设置tint色值,也可以给任意Drawable或者NineP ...
随机推荐
- Elastix 安装G729 G723语音编码
下載適合自己機器及軟體版本的模組檔,基本上略分為 pentium/pentium2/pentium3/x86_64,Asterisk 1.2/1.4/1.6.前往 http://asterisk.ho ...
- @Valid基于hibernate
第一步:添加依赖: <!--jsr 303--> <dependency> <groupId>javax.validation</groupId> &l ...
- 【Web】前端文件上传,带进度条
最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...
- idea创建spring boot+mybatis(oracle)+themeleaf项目
1.新建项目 选择idea已经有的spring initializr next,然后填写项目命名,包名 然后next,选择所需要的依赖 然后一路next,finish,项目新建成功,然后可以删除下面的 ...
- Web 开发
Django(发音:[`dʒæŋɡəʊ]) 是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,模型(Model).模板(Template)和视图(Views).
- 2018.11.06 bzoj1835: [ZJOI2010]base 基站选址(线段树优化dp)
传送门 二分出每个点不需要付www贡献的范围,然后可以推出转移式子: f[i][j]=f[i−1][k]+value(k+1,j)+c[i]f[i][j]=f[i-1][k]+value(k+1,j) ...
- 2018.10.25 bzo1227: [SDOI2009]虔诚的墓主人(组合数学+扫描线+bit)
传送门 有点难调啊.其实是我自己sb了 不过交上去1A1A1A还是平衡了一下心态. 所以这道题怎么做呢? 我们考虑对于一个点(x,y)(x,y)(x,y)如果这个点成为中心,正左/右/上/下分别有l/ ...
- 使用Ant发布web应用到tomcat
使用Ant发布web应用到tomcat 来自:http://blog.csdn.net/hbcui1984/article/details/1954537 今天在公司用ant写了个部署web应用的脚本 ...
- pat -1004(树的遍历)
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184 思路: (1)用vector记录每 ...
- vue 开发系列(七) 路由配置
概要 用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将 ...