我需要知道上传到我的Ruby on Rails应用程序的图像的平均颜色。是否可以获取十六进制或RGB格式的平均颜色值,以便稍后在显示该图像的视图中使用此颜色?类似于:
Something like:
img = Magick::Image.read(path).first
hexVal = img.getHexValue
Something like:
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)
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
中得到介于零和255之间的整数的RGB分量,以十六进制格式获取平均颜色应该很容易。如果需要,您可以轻松地将其合并到平均步骤中。.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进行十六进制转换)
img.quantize(1,Magick::RGBColorspace).color_histogram
考虑使用 Rails 主色调宝石,https://github.com/OpenGems/rails_dominant_colors