Не думаю, что вы можете напрямую запросить изображение 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
хорош и ясен, а ясность важнее, чем ум.
Вы можететакже попробуйте с шагом и без шага квантования и используйте тот, который лучше всего подходит для изображений, с которыми вы работаете.