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获取图片主调颜色的更多相关文章

  1. php 获取图片主要颜色的方法

    本文章向码农们介绍php 获取图片主要颜色的方法,主要涉及php针对图片的相关操作技巧,需要的码农可以参考一下. $i = imagecreatefromjpeg("image.jpg&qu ...

  2. PHP获取图片主题颜色

    (1)工具类:pictureColor.php class pictureColor{     /**     * 获取颜色使用库类型     */    public $type = 'gd';   ...

  3. php 提取图片主要颜色

    PHP实现获取图片颜色值的方法 PHP获取图片颜色值检测图片主要颜色是通过imagecreatefromjpeg函数读取图片,再循环获得各个颜色值加以计算实现的. /** * 获取图片主要颜色 * @ ...

  4. cocos2d-x 获取图片的某像素点的RGBA颜色 -转

    cocos2d-x 获取图片的某像素点的RGBA颜色  原文:http://www.cnblogs.com/jaoye/archive/2013/02/19/2916501.html 没做过 太多的图 ...

  5. [Swift通天遁地]五、高级扩展-(5)获取互补色、渐变色、以及图片主题颜色

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. 通过分析HSL/HSB获取图片主色调

    这两天稍微研究了一下颜色的HSL/HSB值,主要因为写程序想要实现通过一张图片拿到图片中的最突出的颜色值(类似Groove Music中播放栏背景就是从专辑封面中取出主色调,还有Windows 10任 ...

  7. UWP应用载入SVG图片的兼容性方案

    原文 UWP应用载入SVG图片的兼容性方案 新版本<纸书科学计算器>的更新点之一,就是优化了表达式的显示方式.在旧版本中,表达式里的符号是用png图片显示的,当用户放大看的时候会发现一些锯 ...

  8. Atitit 动态按钮图片背景颜色与文字组合解决方案

    Atitit 动态按钮图片背景颜色与文字组合解决方案 转换背景颜色,setFont("cywe_img", fontScale, 50, 5) 设置文字大小与坐标 文字分拆,使用字 ...

  9. Android5.0新特性——图片和颜色(drawable)

    图片和颜色 tint属性 tint属性一个颜色值,可以对图片做颜色渲染,我们可以给view的背景设置tint色值,给ImageView的图片设置tint色值,也可以给任意Drawable或者NineP ...

随机推荐

  1. Maximum Size Subarray Sum Equals k LT325

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  2. 进度条的制作unity

    不说了直接上代码: LoadingPanel: using UnityEngine;using System.Collections;using UnityEngine.UI;using UnityE ...

  3. php代码中pre的作用??

  4. Python中逗号的妙用

    闲着没事打算用Python刷一遍pat,输出过程中遇到了一个这样的问题: 题目1002题目要求 在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格, 但是P ...

  5. 2018.12.30 bzoj3027: [Ceoi2004]Sweet(生成函数+搜索)

    传送门 生成函数好题. 题意简述:给出n个盒子,第iii个盒子里有mim_imi​颗相同的糖(但不同盒子中的糖不相同),问有多少种选法可以从各盒子中选出数量在[a,b][a,b][a,b]之间的糖果. ...

  6. jquery 特效

    http://demo.howtoexe.com/instagram-gravity-gallery/index.html

  7. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  8. c语言const和c++const

    1.常量 常量是指值不能被改变的量,又叫做字面值 1.1常量分类 1)字符常量:'a', 'A', '*'. 2)字符串常量:"helloworld","ilovechi ...

  9. 图解TCP/IP(一)

    IP(Internet Protocol) IP/ICMP -数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递.而一旦跨越多种数据链路,就需要借助网络层. -配备IP的设备,但是不进行路 ...

  10. Kotlin入门

    转载自:https://www.cnblogs.com/jaymo/articles/6924144.html 创建类的实例 要创建一个类的实例,我们就像普通函数一样调用构造函数: 1 2 3 val ...