使用
require 'mini_magick'
gem 'mini_magick'
bundle install
以迴圈從form上傳為例,可以自己整合到service或其他地方,運用物件導向原理改良。
params[:file].each do |uploaded_file|
next unless uploaded_file.is_a?(ActionDispatch::Http::UploadedFile)
Rails.logger.info uploaded_file
begin
original_filename = uploaded_file.original_filename
original_path = Rails.root.join('public', 'uploads', 'original', original_filename)
FileUtils.mkdir_p(File.dirname(original_path))
FileUtils.cp(uploaded_file.tempfile.path, original_path)
puts "已保存原圖: #{original_path}"
image = MiniMagick::Image.new(uploaded_file.tempfile.path)
image.combine_options do |i|
width, height = image[:width], image[:height]
if width > height
x_offset = [(width - height) / 2, 0].max
i.crop "#{height}x#{height}+#{x_offset}+0"
else
y_offset = [(height - width) / 2, 0].max
i.crop "#{width}x#{width}+0+#{y_offset}"
end
i.resize "300x300!"
end
cropped_filename = "cropped_#{uploaded_file.original_filename}"
cropped_path = Rails.root.join('public', 'uploads', 'cropped', cropped_filename)
FileUtils.mkdir_p(File.dirname(cropped_path))
image.write(cropped_path)
puts "Cropped and saved: #{cropped_path}"
rescue => e
Rails.logger.error "Error processing image: #{e.message}"
puts "Error processing image: #{e.message}"
end
end