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

问题描述 投票:13回答:6

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

就像这样。

img =  Magick::Image.read(path).first
hexVal = img.getHexValue
ruby image-processing imagemagick rmagick
6个回答
22
投票

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

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

19
投票

我不认为你可以直接要求一张RMagick图像的平均颜色,但计算这样的东西并不难。

我想最简单的方法是提取出图像的 色彩直方图 然后用它来计算你的平均值。你可能想用 量化 不过先计算图像的直方图,如果你只是对平均数感兴趣的话,计算一个有很多颜色的图像的直方图并不便宜,而且可能是毫无意义的繁忙工作。

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 }

最后,你有RGB组件 avg 作为零和255之间的整数,得到十六进制的平均颜色应该是很简单的。如果需要的话,你可以很容易地将其合并到平均化步骤中。

我也许可以在迭代器上做得更聪明一些,但是 .each 是很好的和清晰的,清晰比聪明更重要。

你也可以尝试使用和不使用量化步骤,并使用任何一个最适合你工作的图像。


3
投票

我找到了我的解决方案(此处),在我测试了这里介绍的所有可能性后。

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的十六进制颜色转换功能,因为它是ruby的一个难题(否则我就用sprintf转换为十六进制颜色)。


1
投票

可以考虑使用miro gem,它似乎遵循了 "mu太短 "的方法。https:/github.comjonbudamiro


1
投票

根据@muistooshort--如果量化函数所做的只是通过取像素颜色的平均值(假设)使图像不那么复杂--如果你只是将图像量化到颜色一样,岂不是更简单。

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

然后使用结果的颜色,不是更简单吗?


0
投票

可以考虑使用rails的显色宝石。https:/github.comOpenGemsrails_dominant_colors。

© www.soinside.com 2019 - 2024. All rights reserved.