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