Вкратце:
img.crop("#{size}#{offset}") # Doesn't return an image...
img # ...so you'll need to call it yourself
Вот лучшее объяснение почему это произошло в отличие от решения в стиле вырезки / вставки.
RMagick и MiniMagick aren 'т взаимозаменяемы.RMagick имеет очень похожий на Ruby DSL и поэтому использует методы, которые принимают несколько аргументов:
rmagick_image.crop(x_offset, y_offset, width, height) # Returns an image object
rmagick_image.crop!(x_offset, y_offset, width, height) # Edits object in place
MiniMagick вместо этого динамически генерирует методы путем итерации по списку MOGRIFY_COMMANDS
, которые соответствуютс многочисленными опциями с префиксом тире, указанными в документации mogrify
ImageMagick .Каждый из этих методов передает свои аргументы непосредственно mogrify
, и ни один из них не возвращает объект изображения:
minimagick_image.crop('100x200') # Translates to `mogrify -crop 100x200 image.ext`
minimagick_image.polaroid('12') # Executes `mogrify -polaroid 12 image.ext`
В натуральном выражении RMagick имеет crop!
, а MiniMagick - нет.
Согласно документам ImageMagick, mogrify -crop
принимает аргумент geometry
.Аргумент geometry
объясняется здесь .Вы заметите, что все этих аргументов являются строками, поэтому вместо crop(100,200)
вы бы использовали crop('100x200')
или crop('100%)
.Он не очень похож на Ruby, но это часть того, что делает MiniMagick таким легким.
С этим знанием мы можем сделать вывод, как обрезать с помощью MiniMagick.mogrify -crop
может принимать геометрию в виде строки width
x height
+ xoffset
+ yoffset
, поэтому нам просто нужно построитьпохожая строка.
Учитывая w
, h
, x
и y
, вы можете использовать любое из следующего, которое вы найдете наиболее читабельным:
# Concatenating plus signs with plus signs is atrociously confusing.
# Recommended only if you want to drive your future self insane.
mogrify_arg = w + 'x' + h + '+' + x + '+' + y
# Readable but inefficient
mogrify_arg = [ w, 'x', h, '+', x, '+', y ].join('')
# Questionable readability
mogrify_arg = "#{w}x#{h}+#{x}+#{y}"
# Slick, performant, but potentially risky: `<<` modifies the receiving object in place
# `w` is actually changing here to "WxH+X+Y"...
mogrify_arg = w << 'x' << h << '+' << x << '+' << y
# A lovely, self-documenting version
size = w << 'x' << h
offset = '+' << x '+' << y
mogrify_arg = "#{size}#{offset}"
Вотполный пример:
def crop
if model.crop_x.present?
resize_to_limit(700, 700)
manipulate! do |img|
x = model.crop_x
y = model.crop_y
w = model.crop_w
h = model.crop_h
size = w << 'x' << h
offset = '+' << x << '+' << y
img.crop("#{size}#{offset}") # Doesn't return an image...
img # ...so you'll need to call it yourself
end
end
end