Rails: обрезка изображений с помощью Paperclip, S3 и RMagick - PullRequest
3 голосов
/ 07 марта 2009

В настоящее время я пытаюсь кодировать пользовательскую систему обрезки изображений, аналогичную другим в Интернете, где пользователь может выбрать область обрезки, а затем соответствующим образом обрезать свое изображение. Приложение находится в 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 через скрепку и, следовательно, не обрезается должным образом. Кто-нибудь пробовал что-то подобное с помощью скрепки? Возможно, это даже невозможно, но любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 07 марта 2009

В настоящее время я могу решить эту проблему следующим образом:

  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 является частью библиотеки скрепок.

0 голосов
/ 08 марта 2009

Возможно, вы захотите поближе взглянуть на Процессоры Paperclip .

У меня фактически такая же проблема в моем собственном коде, и она есть в моем списке задач.

0 голосов
/ 07 марта 2009

Вы можете определить некоторые 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
...