【问题标题】:ColorThief returning wrong dominant colorColorThief 返回错误的主色
【发布时间】:2019-06-15 10:59:47
【问题描述】:

在我的 UWP 应用程序中,我们有用户上传的图像,它们几乎可以是任意大小 - 所以当我将它们加载到图像控件中时,我会按比例调整它们的大小,以便它们最适合我们的图像容器(固定为 112w x 152h) 但由于某些图像比更高的图像更宽,我想要找到图像的背景颜色,以便我可以设置图像的背景。

为此,我使用NuGet ColorThief package 和下面的代码(取自我在那里找到的示例)在许多情况下返回错误的主色:

var ct = new ColorThief();
QuantizedColor qc = await ct.GetColor(decoder);  //BitmapDecoder containing image
Windows.UI.Color c = Windows.UI.Color.FromArgb(qc.Color.A, qc.Color.R, qc.Color.G, qc.Color.B);     
setImageBackgroundColor(bgColour);

我尝试过的一张图片就是这张 - 现在主色显然应该是黑色,但它会返回一些中等灰色......所以我的代码或图片有问题还是我需要其他东西去做?我只是觉得它不可靠,但我知道其他人使用它没有问题。

【问题讨论】:

    标签: image colors uwp background color-thief


    【解决方案1】:

    在我看来,您需要将质量设置为 5 到 10,并使用 GetPalette 方法和调色板中的第一种颜色。

    QuantizedColor dominantColor = colorThief.GetPalette(tempBitmap, 5, 5, true)[0];
    

    【讨论】:

      【解决方案2】:

      根据图书馆的source code,它似乎实际上是从图片的调色板中平均出颜色

      public async Task<QuantizedColor> GetColor(BitmapDecoder sourceImage, int quality = DefaultQuality, 
                                                 bool ignoreWhite = DefaultIgnoreWhite)
      {
          var palette = await GetPalette(sourceImage, 3, quality, ignoreWhite);
      
          var dominantColor = new QuantizedColor(new Color
          {
              A = Convert.ToByte(palette.Average(a => a.Color.A)),
              R = Convert.ToByte(palette.Average(a => a.Color.R)),
              G = Convert.ToByte(palette.Average(a => a.Color.G)),
              B = Convert.ToByte(palette.Average(a => a.Color.B))
          }, Convert.ToInt32(palette.Average(a => a.Population)));
      
          return dominantColor;
      }
      

      在这种特殊情况下,我认为将ignoreWhite 设置为true 可能会返回实际的黑色,尽管true 似乎确实是默认设置。

      我建议使用库提供的另一个public 方法:GetPalette,以查看此图像的实际调色板是什么。这应该可以解释为什么你会得到这种特殊的颜色。

      var palette = await GetPalette(decoder);
      

      【讨论】:

      • 感谢 Martin - 我现在已经非常广泛地使用它,发现量化颜色确实是某种平均颜色,并且在我尝试的所有图像中大部分是错误的(就用作 b/g 而言即颜色)除非图像非常基本并且具有大量一种颜色 - 所以我不能使用它。我还尝试从 Palette 中获取“Population”的最高值并尝试质量(1-10)以及它检索到的颜色数量,它更可靠,但仍然不理想......虽然仍在尝试。
      • ...所以现在我想不回答这个问题,看看我是否能找到一种可靠的方法来做到这一点。以前我获取每个角像素的颜色并使用算法来决定使用哪种颜色(包括透明),但这也会产生相当多的误报。我想真的没有可靠的方法来做到这一点,因为图像可以包含如此多的颜色和渐变,我们的眼睛并不总是可见......例如,看起来像纯白色 b/g 的图像实际上报告最多使用的颜色是淡奶油,所以对于 b/g 来说仍然是错误的......叹息:-(
      • @nzmike 你最终选择了另一个库,还是你能弄清楚如何使用 colorthief?
      猜你喜欢
      • 2020-11-11
      • 1970-01-01
      • 2011-06-16
      • 2023-04-03
      • 2019-11-07
      • 1970-01-01
      • 2021-10-01
      • 2012-07-01
      • 1970-01-01
      相关资源
      最近更新 更多