当我将图像上传到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 }
最后,你有RGB组件 avg
作为零和255之间的整数,得到十六进制的平均颜色应该是很简单的。如果需要的话,你可以很容易地将其合并到平均化步骤中。
我也许可以在迭代器上做得更聪明一些,但是 .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的十六进制颜色转换功能,因为它是ruby的一个难题(否则我就用sprintf转换为十六进制颜色)。
可以考虑使用miro gem,它似乎遵循了 "mu太短 "的方法。https:/github.comjonbudamiro
根据@muistooshort--如果量化函数所做的只是通过取像素颜色的平均值(假设)使图像不那么复杂--如果你只是将图像量化到颜色一样,岂不是更简单。
img.quantize(1,Magick::RGBColorspace).color_histogram
然后使用结果的颜色,不是更简单吗?
可以考虑使用rails的显色宝石。https:/github.comOpenGemsrails_dominant_colors。