确定照片区域的合同颜色

Determining the contract color of an area of a photo

试图找出一种方法来确定照片区域的最佳对比色。对比色将用作某些覆盖文本的颜色。

使用六工 ImageSharp,到目前为止我已经能够:

  1. 将图像流加载到 Sixlabor ImageSharp 图像中:
    myImage = Image.Load(imageStream)
  2. 使用 Crop 进行变异以划分出文本应该所在的大约区域:
    myImage.Mutate(x =>x.Crop(rectangle))

但是如何确定裁剪区域的 average/dominate 颜色?

我在某处看到过一种方法是将裁剪区域的大小调整为一个像素的大小。这很容易做到(下一步将是:myImage.Mutate(x => x.Resize(1,1))),但是我如何提取这个像素的颜色呢?

当我得到这个颜色时,我打算使用 this 方法来计算对比色。

这是我最终解决这个问题的方法,使用 this algorithm 确定最佳对比字体颜色(黑色或白色)。

private Color GetContrastColorBW(int x, int y, int height, int width, stream photoAsStream)
{
    var rect = new SixLabors.Primitives.Rectangle(x,y, height, width);

    var sizeOfOne = new SixLabors.Primitives.Size(1,1);

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

    var croppedImageResizedToOnePixel = image.Clone(
        img => img.Crop(rect)
        .Resize(sizeOfOne));

    var averageColor = croppedImageResizedToOnePixel[0, 0];

    var luminance = (0.299 * averageColor.R + 0.587 * averageColor.G + 0.114 * averageColor.B) / 255;

    return luminance > 0.5 ? Color.Black : Color.White;
}

我已经重写了你的答案。这应该更快更准确,并使用现有的 API.

private Color GetContrastColorBW(int x, int y, int height, int width, stream photoAsStream)
{
    var rect = new Rectangle(x, y, height, width);

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

    // Reduce the color palette to the the dominant color without dithering.
    var quantizer = new OctreeQuantizer(false, 1);
    image.Mutate( // No need to clone.
        img => img.Crop(rect) // Intial crop
                  .Quantize(quantizer) // Find the dominant color, cheaper and more accurate than resizing.
                  .Crop(new Rectangle(Point.Empty, new Size(1, 1))) // Crop again so the next command is faster
                  .BinaryThreshold(.5F, Color.Black, Color.White)); // Threshold to High-Low color. // Threshold to High-Low color, default White/Black

    return image[0, 0];
}