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 ...
随机推荐
- hehe,网易邮箱已经流氓到这个地步了
网易邮箱现在感觉作死,申请个邮箱还要下载你的APP,好,你牛逼,再见. 这是态度的问题. 最近丢了5亿的用户信息死不承认,撞库能把密保问题给撞出来? 如果真是撞库的话,丁三石养猪也已经感染口蹄疫了吧.
- JS高级-String- RegExp- Math- Date:
1. String: 切割: 将一个字符串,按指定分隔符,切割为多段子字符串 简单切割: 切割符是固定的 var arr=str.split("切割符") 强调: 切割后的结果中, ...
- canvas 实现飘浮桥效果
var canvas = document.getElementById('canvas'); var cxt = canvas.getContext('2d'); var timer; var iS ...
- python早期看书笔记
- 谈互联网开放平台:“去中心化”大势所趋 zz
文/磐石之心 几天前与好友聊到众筹咖啡馆的事情,他向我讲述了一个非常具有特色的众筹咖啡馆案例.而这个案例也引发我对当前互联网开放.去中心和集权的一些思考,今天就简单写出来与大家分享. 一个无赚钱目的的 ...
- 字符串算法hash
思路:给字符串做一个映射,两个元素相同,则他们的hash值必定相同. 注意:hash表必须是unsigned int类型,保证每个映射都是正数. 例题: Description 给出两个字符串W和T, ...
- python模块:pickle
"""Create portable serialized representations of Python objects. See module copyreg f ...
- myeclipse cannot connect to vm
启动tomcat时,tomcat可以直接运行,而debug时弹出 解决方法:打开360安全卫士的功能大全找到修复网络(LSP)点击立即修复就可以使用debug
- 虚拟机CentOs的安装及大数据的环境搭建
大数据问题汇总 1.安装问题 1.安装步骤,详见文档<centos虚拟机安装指南> 2.vi编辑器使用问题,详见文档<linux常用命令.pd ...
- css3 box-sizing详解。
人们慢慢的意识到传统的盒子模型不直接,所以他们新增了一个叫做 box-sizing 的CSS属性. box-sizing: 盒大小,盒模型. 我们经常遇到左右模块宽度为50%,加个边框会掉下去,加一个 ...