Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 色差返回错误的主色_Image_Colors_Uwp_Background_Color Thief - Fatal编程技术网

Image 色差返回错误的主色

Image 色差返回错误的主色,image,colors,uwp,background,color-thief,Image,Colors,Uwp,Background,Color Thief,在我的UWP应用程序中,我们有用户上传的图像,它们几乎可以是任何大小——因此,当我将它们加载到图像控件中时,我会按比例调整它们的大小,以便它们最适合我们的图像容器(固定为112w x 152h)但是,由于有些图像的宽度大于高度,我想找到图像的背景颜色,这样我就可以设置图像的背景 为此,我使用了,下面的代码(取自我在那里找到的示例)在许多情况下返回了错误的主色: var ct = new ColorThief(); QuantizedColor qc = await ct.GetColor(dec

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

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

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);
我试过的一张图片是这张——现在主色调应该是黑色,但它返回了一些中灰色。。。。那么,我的代码或图像是否有问题,或者我还需要做些什么?我只是觉得它不可靠,但我知道其他人使用它没有问题

根据该库的功能,它似乎实际上是从图片的调色板中平均出颜色

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;
}

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

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

感谢Martin-我现在已经广泛地使用了它,发现量化颜色确实是某种平均颜色,我尝试的所有图像大多是错误的(就用作b/g颜色而言),除非图像非常基本,并且有大量的单一颜色-所以我不能使用它。我还试着从调色板中选取“总体”的最高值,并对质量(1-10)和检索到的颜色进行实验,结果更可靠,但仍然不理想。。。。但仍在试验……所以现在我想不回答这个问题,看看我是否能找到一个可靠的方法。之前,我得到每个角点像素的颜色,并使用algrotihm来决定使用哪种颜色(包括透明),但这也会造成相当多的误报。我想真的没有可靠的方法可以做到这一点,因为一张图像可能包含如此多的颜色和渐变,我们的眼睛并不总是看得见的。。。例如,一张看起来像是纯白色b/g的图像实际上报告说最常用的颜色是浅奶油色,所以b/g仍然是错误的。。。。叹气:-(@nzmike)你最终选择了另一个库,或者你能想出如何使用它吗?
QuantizedColor dominantColor = colorThief.GetPalette(tempBitmap, 5, 5, true)[0];