如何使用ImageMagick找到图像的平均颜色?

13

如何获取图像的平均RGB值,每个值范围在0-255之间?例如"255, 255, 255"。

我运行此命令将图像缩小,它返回带有alpha通道的'rgba'值,有时还会给出文本颜色名称:

convert cat.png -resize 1x1\! -format "%[pixel:u]\n" info:

输出:

rgba(155,51,127,0.266087)
3个回答

32

我的回答有两个方面:

  1. 将原始图像调整大小为1像素图像。这个像素将具有ImageMagick的convert视为“平均”颜色。
  2. 将结果输出为convert支持的特殊.txt格式。这种文本格式枚举图像的所有像素,首先给出它的坐标($row,$column:),然后以不同格式给出其RGB或CMYK值。

以下命令涵盖了这两个方面:

convert cat.png -resize 1x1 out.txt
cat out.txt

如需直接在终端窗口中输出结果,您可以使用:

convert cat.png -resize 1x1 txt:-

示例输出:

convert p4.png -resize 1x1 txt:-
  # ImageMagick pixel enumeration: 1,1,255,srgb
  0,0: (189,185,184)  #BDB9B8  srgb(189,185,184)

1
比被接受的答案简单得多且更详细。 - Stephen Talley
3
要一次性获取十六进制代码,请尝试使用命令convert p4.png -resize 1x1 txt:- | grep -Po "#[[:xdigit:]]{6}",如果您喜欢小写字母,可以将其进一步传输到tr A-F a-f - tremby

10
你可以按照以下方法进行解析,仅获取逗号分隔的RGB值,同时不会返回文本颜色名称。
convert cat.png -resize 1x1\! \
    -format "%[fx:int(255*r+.5)],%[fx:int(255*g+.5)],%[fx:int(255*b+.5)]" info:-

输出格式应该像这样:

155,51,127

这应该适用于ImageMagick 6.3.9.1以上版本。


1
使用特殊的输出格式.txt更容易 :-) - Kurt Pfeifle
在这个答案的基础上,我想要得到RGB三元组的十六进制等价物。我对命令行处理还是很新手,所以这可能不是最优的,但希望能为某些人节省时间:convert cat.png -scale 1x1\! -format '%[fx:int(255*r+.5)],%[fx:int(255*g+.5)],%[fx:int(255*b+.5)]' info:- | sed 's/,/\n/g' | xargs -L 1 printf "%x" - Illya Moskvin
注意ImageMagick默认处理伽马问题的不良方式;当缩小到1x1时,这可能特别明显。一个有关好信息的页面:http://www.ericbrasseur.org/gamma.html#ImageMagick - jwd

1
使用NuGet Magick.Net包并借鉴命令行示例,这是C#的方法。
ImageMagick.IMagickColor<ushort> color;
using (ImageMagick.MagickImage image = new ImageMagick.MagickImage(file))
{
    // Get average color
    image.Resize(1, 1);
    color = image.GetPixels().First().ToColor();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接