Rails: обрезка изображений с помощью Paperclip, S3 и RMagick
-
05-07-2019 - |
Вопрос
В настоящее время я пытаюсь кодировать пользовательскую систему обрезки изображений, аналогичную другим в Интернете, где пользователь может выбрать область обрезки, а затем соответствующим образом обрезать свое изображение. Приложение находится в Rails, и мы используем Paperclip с Amazon S3 для хранения файлов. У меня много проблем, хотя я заставляю RMagick правильно обрезать файл с S3. Вот текущий код (который не работает):
if params[:width].to_i > 0 and params[:height].to_i > 0 then
photo = Photo.find(params[:id])
image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
orig_img = Magick::ImageList.new
orig_img.from_blob(image_data)
args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
orig_img.crop!(*args)
photo.update_attributes({:photo => orig_img.to_blob})
photo.photo.reprocess!
photo.save
end
Основная проблема заключается в том, что обрезанное изображение не загружается обратно на S3 через скрепку и, следовательно, не обрезается должным образом. Кто-нибудь пробовал что-то подобное с помощью скрепки? Это может даже не быть возможным, но любая помощь будет принята с благодарностью.
Решение
В настоящее время мне удалось решить эту проблему следующим образом:
photo = Photo.find(params[:id])
image_data = Net::HTTP.get_response(URI.parse(photo.photo.url(:big))).body
orig_img = Magick::ImageList.new
orig_img.from_blob(image_data)
args = [params[:x1].to_i, params[:y1].to_i, params[:width].to_i, params[:height].to_i]
orig_img.crop!(*args)
tmp_img = Tempfile.new("image_data")
orig_img.format = "png"
tmp_img.write(orig_img.to_blob)
photo.photo = tmp_img
tmp_img.close
photo.photo.reprocess!
photo.save
Основное беспокойство здесь вызывает скорость создания нового временного файла, поэтому, вероятно, нам придется создать наш собственный пользовательский интерфейс. Надеюсь, это может стать хорошей отправной точкой для людей, решающих аналогичную проблему.
РЕДАКТИРОВАТЬ: просто заметка, Tempfile является частью библиотеки скрепок.
Другие советы
Вы можете определить некоторые атрибуты attr_accessors в модели и установить их в действии контроллера перед созданием фактического файла. Ниже должно работать ..
class Poodle < ActiveRecord::Base
has_attached_file :avatar, :styles => Proc.new{|a| a.instance.get_styles}
attr_accessor :width, :height
def get_styles(style = "medium")
return {style.to_sym => [self.width, self.height].join("x") + ">" }
end
end
Возможно, вы захотите поближе ознакомиться с процессорами Paperclip . р>
У меня фактически такая же проблема в моем собственном коде, и она есть в моем списке задач.