Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top