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

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

就像是:

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

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

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

我不认为你可以直接询问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 } 

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

我可能对迭代器更聪明,但是。 .each都很清楚,清晰度比聪明更重要。

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

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

 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将转换添加到hex颜色,因为它是带ruby的皮塔饼(否则我使用sprintf转换为hex)

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

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

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

并使用产生的颜色?