ColorThief возвращает неправильный доминирующий цвет - PullRequest
0 голосов
/ 22 января 2019

В моем приложении UWP у нас есть изображения, которые пользователи загружают, и они могут быть практически любого размера - поэтому, когда я загружаю их в элемент управления изображениями, я пропорционально изменяю их размер, чтобы они лучше подходили к нашему контейнеру изображений (который установлен на 112wx 152h) но поскольку некоторые изображения шире, чем выше, я хочу найти цвет фона изображения, чтобы я мог установить фон изображения.

Поэтому для этого я использую Пакет NuGet ColorThief и приведенный ниже код (взятый из образца, который я там нашел) во многих случаях возвращает мне неправильный доминирующий цвет:

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

1 Ответ

0 голосов
/ 22 января 2019

Согласно исходному коду библиотеки, кажется, что она на самом деле усредняет цвета из цветовой палитры рисунка

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...