要するに:
img.crop("#{size}#{offset}") # Doesn't return an image...
img # ...so you'll need to call it yourself
切り取り/貼り付けスタイルのソリューションとは対照的に、これがなぜ起こったのかについてのより良い説明を次に示します。
RMagick と MiniMagick は互換性がありません。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は、 ImageMagick のドキュメントで指定されている多数のダッシュ接頭辞付きオプションと一致するリストを反復処理することにより、MOGRIFY_COMMANDS
動的にメソッドを生成します。これらの各メソッドは引数を直接渡しますが、画像オブジェクトを返すものはありません。mogrify
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 docs によるとmogrify -crop
、引数を取りますgeometry
。ここでgeometry
引数 を 説明 します. これらの引数はすべて文字列であるため、代わりにorcrop(100,200)
を使用することに気付くでしょう。Ruby にあまり似ていませんが、それが MiniMagick を非常に軽量にしている理由の 1 つです。crop('100x200')
crop('100%)
その知識があれば、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