1

我正在尝试寻找替代方案System.DrawingColorThief在 Linux 的 docker 容器中使用(因为前面提到的有一些问题)。

到目前为止,我找到了这个要点

但它似乎在旧版本上,因为OctreeQuantizer现在有一个不同的构造函数。

我尝试了不同的方法,但大多数时候我要么总是得到FFFFFF一个空引用异常。

当我尝试时,我得到了 NRE new OctreeQuantizer(new QuantizerOptions { Dither = null, MaxColors = 1 }),我认为这可能与要点相同。当我使用 QuantizerOptions 时,我总是变白。

我在图像处理和 ImageSharp 方面几乎没有经验,感觉好像我错过了一些东西。

tl; dr:尝试使用 ImageSharp 从流中找到主色。

4

1 回答 1

0

我遇到过同样的问题。使用下面的代码解决。这有点hacky,但对我来说效果很好。

using var image = Image.Load<Rgba32>(imageBytes);

image.Mutate(x => x
    .Resize(new ResizeOptions {Sampler = KnownResamplers.NearestNeighbor, Size = new Size(100, 0)}));

int r = 0;
int g = 0;
int b = 0;
int totalPixels = 0;

for (int x = 0; x < image.Width; x++)
{
    for (int y = 0; y < image.Height; y++)
    {
        var pixel = image[x, y];

        r += Convert.ToInt32(pixel.R);
        g += Convert.ToInt32(pixel.G);
        b += Convert.ToInt32(pixel.B);

        totalPixels++;
    }
}

r /= totalPixels;
g /= totalPixels;
b /= totalPixels;

Rgba32 dominantColor = new Rgba32((byte) r, (byte) g, (byte) b, 255);

// This will give you a dominant color in HEX format i.e #5E35B1FF
string hexColor = dominant.ToHex(); 
于 2021-12-04T12:27:42.237 回答