Как сделать изображение из нескольких изображений с помощью Carrierwave и MiniMagick

У меня есть модель Image и модель Movie, а у Movie может быть много images. Я храню 3 версии изображения, big, medium and small. В моем приложении пользователи могут выбирать изображения определенного размера, скажем, 4 изображения «среднего» размера, а затем пользователь может поделиться ими. Минимум 3 изображения и максимум 5.

Мне нужно создать изображение со всеми выбранными 4 изображениями среднего размера. Я не хочу отправлять эти изображения по отдельности, я хочу отправить их как одно изображение.

Я использую Carrierwave и MiniMagick.

Спасибо за помощь!


person Manoj Sehrawat    schedule 24.07.2013    source источник


Ответы (1)


Предполагая, что настоящий вопрос здесь касается компоновки изображений с помощью minimagick, вот некоторый код. Обратите внимание, что я добавил в фильм поле под названием «composite_image» и решил, что загрузчик, прикрепленный к изображению, называется «файл».

def render_composite_image(source_images, coordinates)
  temp_file = TempFile.new(['render_composite_image', '.jpg'])
  img = MiniMagick::Image.new(temp_file.path)
  img.run_command(:convert, "-size", "#{ COMPOSITE_WIDTH }x#{ COMPOSITE_HEIGHT }", "xc:white", img.path)

  source_images.each_with_index do |source_image, i|
    resource = MiniMagick::Image.open(source_image.file.path)
    img = img.composite(resource) do |composite|
      composite.geometry "#{ coordinates[i].x }x#{ coordinates[i].y }"
    end
  end

  img.write(temp_file.path)
  self.update_attributes(composite_image: temp_file)
end

Пара замечаний по этому коду:

  • source_images — это массив изображений, которые вы хотите скомпоновать вместе.

  • coordinates — это массив значений координат, где вы хотите, чтобы каждое изображение было в окончательной композиции. Индекс координаты соответствует индексу соответствующего исходного изображения. Также обратите внимание, что если координата положительная, вам необходимо включить символ «+», например. "+50". (Возможно, вам придется поэкспериментировать, чтобы найти нужные координаты.)

  • Если ваши изображения не хранятся локально, вам нужно будет использовать source_image.file.url вместо source_image.file.path.

  • Этот код был написан для работы в контексте модели Movie, но его можно перемещать куда угодно.

person Taavo    schedule 30.08.2013