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. H.264, MPEG4之间的关系

    百度百科搜索 H.264 H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式.H.264是ITU-T以H.26x系列为名称命名的视频编解码技 ...

  2. [cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小

    Windows 命令行 cmd 窗口系统默认的大小(80*40)对于现在的屏幕配置已经跟不上时代了,我们总是要把它改大些,而且缓冲区大小也想改得大大的.单纯的为当前的 Windows 命令行窗口修改显 ...

  3. 【linux轻松学】修改文件权限

    用chmod修改文件权限,此命令非常重要. 用户范围:u 表示当前用户g 表示当前群组o 除u,g之外的用户和群组a 所有用户和群组 权限代号:r :读,用数字4表示w :写,用数字2表示x :执行, ...

  4. 20155312 2016-2017-2 《Java程序设计》第七周学习总结

    20155312 2016-2017-2 <Java程序设计>第七周学习总结 课堂内容总结 read()每次读入一个字节. eg:short2个字节,2=0x0201,读入后要0x < ...

  5. php socket通过smtp发送邮件(纯文本、HTML,多收件人,多抄送,多密送)

    <?php /** * 邮件发送类 * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送 * @example * $mail = new MySendMail(); * ...

  6. windows中当你的键盘无法使用时我们可以用另一种方法哦

    1.使用Win+R打开cmd窗口 2.输入osk回车就出现了一个虚拟的小键盘啦,当你的键盘坏掉后非常实用哦

  7. 微信小程序app.json配置

    找到app.json文件,找到window配置项 1.windows选项下导航栏样式 "navigationBarBackgroundColor":#F6F6F6 // 导航栏的背 ...

  8. Educational Codeforces Round 60 C 思维 + 二分

    https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...

  9. boost--BOOST_AUTO、typeof、result_of

    1.BOOST_AUTO BOOST_AUTO的功能类似于auto和any,可以用来定义任意类型数据,且可以在编译时自动推导出表达式的类型.BOOST_AUTO属于boost中的typeof库,使用需 ...

  10. CPU load高而使用率低的问题分析

    最近服务器上出现了一个很诡异的问题,症状如下图所示: 查看进程发现: 如上图所示,非常多的df -h进程没有退出.于是手工kill掉这些 df -h进程.cpu load恢复正常. 至于为什么会有这么 ...