私は周りを見回しましたが、自分でやろうとした後、解決策を見つけることができませんでした. ユーザーが写真をアップロードするときに、最小サイズと最大サイズを超える場合はサイズを変更したいと考えています。ただし、2 つの条件が必要です。横向き (東/西) で撮影された写真は、私が設定した寸法内にとどまる必要があり、縦向き (北/南) で撮影された写真についても同じことが続きます。
たとえば、ユーザーが遠くに立っている 3264x1840 のサイズの写真をアップロードしたとします。アップロードは、584x329 に収まるようにサイズ変更する必要があります。アップロードが 584x329 未満の場合、サイズは調整されません。
もう 1 つの例は、2448 x 3264 のサイズで縦方向に撮影された写真をユーザーがアップロードした場合です。アップロードは 247x329 に収まるようにサイズを変更する必要があります。
私はこれが要件になると信じているので、これで MiniMagick を使用しようとしていました。CarrierWave しか使えないならそれでいいのですが、写真のサイズ変更には MiniMagick を使うべきだと思っていました。
私が受け取ったエラーは、コントローラーの def create からの「undefined method resize' for #<ImageUploader:0x007f8606feb9b8>' and it points to
@photo = Photo.new(params[:photo])」です。
ところで、写真をアップロードするときの携帯電話のデフォルトのサイズであるため、サイズが大きくなっています。
image_uploader.rb:
class ImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :file
# storage :fog
# Override the directory where uploaded files will be stored.
# This is a sensible default for uploaders that are meant to be mounted:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
process :resize => [584, 329]
def resize_to_limit(width, height)
manipulate! do |img|
img.resize "#{width}x#{height}>"
img = yield(img) if block_given?
img
end
end
# Create different versions of your uploaded files:
version :thumb do
process :resize_to_limit => [200, 200]
end
end
写真コントローラー:
def create
@photo = Photo.new(params[:photo])
@photo.user = current_user
if @photo.save
flash[:notice] = "Successfully created photos."
redirect_to :back
else
render :action => 'new'
end
end
def resize(width, height, gravity = 'Center')
manipulate! do |img|
img.combine_options do |cmd|
cmd.resize "#{width}"
if img[:width] < img[:height]
cmd.gravity gravity
cmd.background "rgba(255,255,255,0.0)"
cmd.extent "#{width}x#{height}"
end
end
img = yield(img) if block_given?
img
end
end