试图找出一种确定照片区域最佳对比颜色的方法。对比色将用作某些重叠文本的颜色。
使用六个Labor ImageSharp,到目前为止,我已经能够:
myImage = Image.Load(imageStream)
myImage.Mutate(x =>x.Crop(rectangle))
但是如何确定该裁剪区域的平均/主色调?
我在某处看到一种方法是将裁剪区域的大小调整为一个像素的大小。这很容易做到(下一步将是:myImage.Mutate(x => x.Resize(1,1))
),但是然后我该如何提取这个像素的颜色呢?
当我得到这种颜色时,我打算使用this方法来计算对比色。
答案 0 :(得分:1)
我已将您的答案重写了。这应该更快,更准确,并使用现有的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];
}
答案 1 :(得分:0)
这是我最终解决此问题的方法,使用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;
}