Dragonfly/imagemagick изменить размер и обрезать и, возможно, добавить белый отступ

С помощью стрекозы я могу сделать следующее:

image.thumb('300x300#')

Что изменит размер изображения, поддерживая соотношение сторон и обрезая его по центру (эффективно обрезая концы самого длинного края).

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

Таким образом, в принципе, если оба края 300px или более, я хочу нормальное поведение от 300x300#, но если какой-либо край меньше 300px, то размер изображения не изменяется вообще, но все равно обрезается до 300x300 с добавлением пробела, где это необходимо.

Возможно ли это с любым из встроенных процессоров Dragonfly (#thumb или же #convert? Или мне нужно собрать собственный процессор? Если да, на какие команды imagemagick мне нужно смотреть?

2 ответа

Лучшим решением было бы создать изображение белого холста размером 300x300, а затем скомпоновать свое изображение по центру поверх изображения холста. Затем обрежьте его с центром тяжести (по центру). Это позволило бы получить изображение размером 300x300 с белым холстом на любых вертикальных или горизонтальных краях, размер которых меньше 300.


** Для этого решения вам может понадобиться установить гем RMagick, так как я не верю, что Dragonfly расширил операции ImageMagick, которые вам понадобятся.

Вот как я бы подошел к этому:

#Set file path first and load a white image called canvas that is 300x300 into Imagmagik
canvas_file_path = "#{Rails.root}/app/assets/images/canvas.png"
canvas_image = Magick::Image.read(canvas_file_path).first

#Then perform the compositing operation.  This overlays your image on top of the canvas, center gravity ensures that your image is centered on the canvas.
canvas_image.composite!(<YOUR IMAGE>, CenterGravity, Magick::OverCompositeOp)

#then  write the file to a temporary file path so you can do something with it
temporary_file_path = "#{Rails.root}/tmp/#{@model.id}"
canvas_image.write(temporary_file_path)

Обязательно добавьте в ваш файл инструкцию require, обратите особое внимание на заглавные буквы, это RMagick, а не Rmagick.

require "RMagick"



Для справки здесь приведен пример ImageMagick из документации для выполнения необходимой вам операции компоновки.

composite -gravity center smile.gif rose: rose-over.png



Документация Rmagick по компоновке изображений - http://www.imagemagick.org/RMagick/doc/image1.html

Rmagick Gem - https://github.com/rmagick/rmagick

Ссылка ImageMagick на композитинг - http://www.imagemagick.org/script/composite.php

У меня есть привычка отвечать на мои собственные вопросы ТАК...

С помощью Dragonfly можно сделать следующее:

def thumb_url
  if image.width < 300 || image.height < 300
    image.convert('-background white -gravity center -extent 300x300').url
  else
    image.thumb('300x300#').url
  end
end
Другие вопросы по тегам