Paperclip を使用して画像を保存していますが、切り抜いた/回転した画像をサムネイルとして作成したいと考えています。Paperclip が実行する必要がある PROPER コマンドは次のとおりです。
convert [file].jpg -gravity center -distort SRT -30 -quality 100 -antialias -flatten -background white -unsharp 0.3x0.3+5+0 -crop 433x433+69+88 +repage -resize "300x300>" [file].jpg
これにより、私が望む結果が得られます。imagemagickをインストールしたPCで直接テストしました。ただし、サーバーのログを見ると、これらの引数の順序が異なります。Paperclip は次のことを望んでいます。 a)-resize "300x300>"
コマンドを最初に配置し、次にコマンド-crop 433x433+69+88
を配置し、その後に残りの引数を配置します。これにより、最終的なイメージの外観が変わります。私が欲しいものではありません。ログに出力される内容は次のとおりです。
convert [file].jpg -auto-orient -resize "300x300>" -crop 433x433+69+88 +repage -gravity center -distort SRT -30 -quality 100 -antialias -flatten -background white -unsharp 0.3x0.3+5+0 [file].jpg
...そして、ここに私のモデルの私の設定があります:
ワイン.rb
has_attached_file :photo, :styles => {
:thumb => {
:geometry => "300x300>",
:format => :jpg,
:processors => [:cropper, :recursive_thumbnail],
:thumbnail => :croppable
},
:general => ["150x375", :jpg],
:show => ["x425", :jpg],
:croppable => ["1200x1200>", :jpg]
},
:url => "/assets/wines/:style/:wine_name",
:path => ":rails_root/public:url",
:default_url => ":wine_default",
:default_path => ":rails_root/public:wine_default",
:default_style => :show,
:convert_options => {
:thumb => '-gravity center -distort SRT -30',
:croppable => '-gravity center -extent 1200x1200',
:general => '-gravity center -extent 150x375 -quality 95',
:all => '-quality 100 -antialias -flatten -background white -unsharp 0.3x0.3+5+0'
},
:processors => [:thumbnail, :compression]
基本的に、[:geometry][:transformations][:convert_options] の順序で convert.exe を実行します。
必要な順序で物事を取得するにはどうすればよいですか?
recursive_thumbnail.rb -- 元のファイルではなく :croppable から :thumb サムネイルの生成を実行するため (トリミング時の水平パディングの問題のため)
module Paperclip
class RecursiveThumbnail < Thumbnail
def initialize file, options = {}, attachment = nil
super Paperclip.io_adapters.for(attachment.styles[options[:thumbnail] || :original]), options, attachment
end
end
end
クロッパー.rb
module Paperclip
class Cropper < Thumbnail
def transformation_command
if crop_command
super.join(' ').sub(/ -crop \S+/, '').split(' ') + crop_command
else
super
end
end
def crop_command
target = @attachment.instance
if target.cropping?
["+repage", "-crop", "#{target.crop_w}x#{target.crop_h}+#{target.crop_x}+#{target.crop_y}", "+repage"]
end
end
end
end