是否可以使用RMagick获得平均图像颜色?

时间:2011-03-02 02:56:09

标签: ruby image-processing imagemagick rmagick

当我将它上传到Ruby on Rails应用程序时,我需要知道图像的平均颜色。是否可以在HEX或RGB中获得平均颜色值,以便稍后在将要显示此图像的视图中使用此颜色?

类似的东西:

img =  Magick::Image.read(path).first
hexVal = img.getHexValue

6 个答案:

答案 0 :(得分:22)

将图像调整为一个像素并获得其颜色?

img =  Magick::Image.read(path).first
pix = img.scale(1, 1)
averageColor = pix.pixel_color(0,0)

答案 1 :(得分:19)

我认为你不能直接询问RMagick图像的平均颜色,但计算这样的东西并不困难。

我认为最简单的方法是提取color histogram,然后用它来计算平均值。你可能首先想要quantize图像,计算具有大量颜色的图像的直方图并不便宜,如果你只对平均值感兴趣,那可能是毫无意义的繁忙工作:

total = 0
avg   = { :r => 0.0, :g => 0.0, :b => 0.0 }
img.quantize.color_histogram.each { |c, n|
    avg[:r] += n * c.red
    avg[:g] += n * c.green
    avg[:b] += n * c.blue
    total   += n
}
[:r, :g, :b].each { |comp| avg[comp] /= total }

这将为您提供avg中的平均颜色。但是,颜色将采用ImageMagick的内部格式(即组件的范围从零到Magick::QuantumRange),因此您必须将它们缩小到0-255:

[:r, :g, :b].each { |comp| avg[comp] = (avg[comp] / Magick::QuantumRange * 255).to_i }

最后你将avg中的RGB分量作为0到255之间的整数,得到十六进制格式的平均颜色应该是微不足道的。如果需要,您可以轻松地将其合并到平均步骤中。

我可能对迭代器更聪明,但.each很好而且清晰,清晰度比聪明更重要。

您也可以尝试使用和不使用量化步骤,并使用最适合您正在使用的图像。

答案 2 :(得分:3)

在我测试了此处提供的所有可能性之后,我找到了我的解决方案(here)。

def maincolor()
  img =  Magick::Image.read(self.url).first
  pix = img.scale(1, 1)
  avg_color_hex = pix.to_color(pix.pixel_color(0,0))
  return avg_color_hex
end

我希望这会有所帮助。我通过rmagick将转换添加到十六进制颜色,因为它是带红宝石的皮塔饼(否则我使用sprintf转换为十六进制)

答案 3 :(得分:1)

考虑使用miro gem,它似乎遵循“mu is too short”的方法: https://github.com/jonbuda/miro

答案 4 :(得分:1)

根据@muistooshort - 如果所有的量化函数都是通过取像素颜色的平均值来使图像变得更简单(假设) - 如果你只是将图像量化为颜色就不会更简单:

img.quantize(1,Magick::RGBColorspace).color_histogram

只使用生成的颜色?

答案 5 :(得分:0)