ColorThief返回错误的主色

时间:2019-01-22 02:23:11

标签: image colors uwp background color-thief

在我的UWP应用中,我们有用户上传的图像,它们几乎可以是任何大小-因此,当我将它们加载到Image控件中时,我会按比例调整它们的大小,以便它们最适合我们的图像容器(固定为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);

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

enter image description here

2 个答案:

答案 0 :(得分:0)

根据该库的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);

答案 1 :(得分:0)

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

index.html