Резюме
Carrierwave передает блок с resize_to_fit и resize_to_limit методу manipulate!
для обрезки изображения.
Изменяя этот блок, вы можете изменить обрезку / изменение размера. Carrierwave
вызывает экземпляр Magick::Image
метод change_geometry
по этой линии .
Метод change_geometry
поддерживает изменение размера метода путем указания ограничений. Например, вы можете указать, что размер изображения должен быть изменен таким образом, чтобы соотношение сторон сохранялось, но результирующее изображение не должно превышать 640 пикселей в ширину и 480 пикселей в высоту.
Аргументом может быть либо строка геометрии , либо объект геометрии . Change_geometry уступает блоку, передавая новые значения ширины и высоты на основе аргумента относительно себя. Возвращаемое значение является возвращаемым значением блока.
Вам необходимо передать блок на manipulate!
аналогично приведенному ниже примеру:
def resize_no_crop(width, height)
width = dimension_from width
height = dimension_from height
manipulate! do |img|
# change the below geometry object to achieve your effect
# geometry = Magick::Geometry.new(width, height, 0, 0, Magick::GreaterGeometry)
new_img = img.change_geometry(geometry) do |new_width, new_height|
img.resize(new_width, new_height)
end
destroy_image(img)
new_img = yield(new_img) if block_given?
new_img
end
end
Установите объект geometry
согласно вашим желаниям
geometry = Magick::Geometry.new(width, height, 0, 0, !)
как я прочитал в документации, последние параметры !
имеют следующий эффект
!
Используйте этот флаг, если хотите, чтобы новое изображение имело размер, точно соответствующий атрибутам width и height.
ImageMagick
инструмент командной строки и Rmagick api docs предоставляют дополнительную информацию.
Объяснение
Carrierwave
использует miniMagick
для выполнения процесса изменения размера .
Gem ImageProcessing использует MiniMagick, мини-замену RMagick, использующую инструменты командной строки ImageMagick, для создания команды "convert", которая выполняет обработку.
Так работает метод resize_to_limit
, он может помочь вам создать собственный метод с использованием инструментов командной строки Rmagick
и ImageMagick
.
module MiniMagick
extend ActiveSupport::Concern
included do
require "image_processing/mini_magick"
end
module ClassMethods
def convert(format)
process :convert => format
end
def resize_to_limit(width, height)
process :resize_to_limit => [width, height]
end
end
end
method
управляет изображениями с помощью инструмента командной строки ImageMagick
и Rmagick . Вы можете посетить вышеуказанные сайты, чтобы прочитать их документацию.
Как вы можете прочитать ниже resize_to_limit
управляет изображением, создавая новый экземпляр Magick::Geometry
и передавая width
, height
, x,y
и flag
def resize_to_limit(width, height)
width = dimension_from width
height = dimension_from height
manipulate! do |img|
# Read The Explanation below
end
end
Carrierwave
создал свой собственный manipulate!
метод , который будет повторяться с оператором yield и обрезать / изменять размер изображения
image.each_with_index do |frame, index|
frame = yield(*[frame, index, options].take(block.arity)) if block_given?
frames << frame if frame
end
Метод each_with_index
будет перебирать между manipulate! do ... end
с оператором yield.
*[frame, index, options].take(block.arity)
, .take(block.arity)
будет проходить только frame
, так как он называется только с одним параметром .
Переменная frame
будет равна возвращаемому new_image
.
geometry = Magick::Geometry.new(width, height, 0, 0, Magick::GreaterGeometry)
new_img = img.change_geometry(geometry) do |new_width, new_height|
img.resize(new_width, new_height)
end
destroy_image(img)
new_img = yield(new_img) if block_given?
new_img
Вы можете узнать больше о Image :: Magick class и на rmagick.github.io , чтобы лучше понять, как работает процесс выбора кадра.