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. jquery plugin 之 form表单验证插件

    基于h5表单验证系统.扩展了对easyui组件的支持 先上图: 提示样式用到了伪对象的 {content: attr(xxx)}函数方法,实现提示信息能动态切换. 1.关键属性说明: type: 表单 ...

  2. datagrid 扩展 页脚 合计功能

    效果图:合计信息展示在页脚中(showFooter:true) code: <!DOCTYPE html> <html> <head> <meta chars ...

  3. nginx xxx.conf

    server { listen 80 ; server_name xxx.test.cn localhost 127.0.0.1 115.29.96.222; access_log /var/log/ ...

  4. 数的划分(NOIP2001&水题测试2017082401)

    题目链接:数的划分 这题直接搜索就行了.给代码,思路没什么好讲的,要讲的放在代码后面: #include<bits/stdc++.h> using namespace std; int d ...

  5. Ajax的爬取心得

    一.查找到js的网址 在我们做爬虫的时候,如何判断一个数据是Ajax(asynchronous JavaScript And Xml,异步的JavaScript和Xml), 首先是数据的加载,在请求网 ...

  6. fabric 安装

    fabric 是一个python的库,fabric可以通过ssh批量管理服务器. 第一步安装依赖包 安装fabric依赖及pip yum install -y python-pip gcc pytho ...

  7. Laravel创建自定义 Artisan 控制台命令实例教程

    来源:http://laravelacademy.org/post/1374.html 1.入门 Laravel通过Artisan提供了强大的控制台命令来处理非浏览器业务逻辑.要查看Laravel中所 ...

  8. Win7 VS2013环境编译Lua5.3.1

    主要参考这篇文章,原文有几个错误顺便改正了. 在Windows下使用Visual Studio编译Lua5.3 写本文时Lua官方网站放出的新版本为5.3.1,然后我不知道为啥,神奇的国内不能访问Lu ...

  9. C++IO cin

    cin cin.get() 每次只读缓冲区一个字符,不能接收空格 cin.getline() 读缓冲区一行,能够接收空格 cin.ignore(2) 忽略缓冲器2个字节 int i = cin.pee ...

  10. 第17章:MongoDB-聚合操作--聚合管道--$group

    ①$group 作用:将集合中的文档进行分组,可用于统计结果. 例如: db.scores.aggregate({“$group”:{“_id”:“$studentId”}}); 或者是 db.sco ...