2009-03-06 4 views
3

В настоящее время я пытаюсь закодировать собственную систему обрезки изображений, подобную другим, в Интернете, где пользователь может выбрать область обрезки, а затем соответствующим образом обрезать изображение. Приложение находится в Rails, и мы используем Paperclip с Amazon S3 для хранения файлов. У меня много неприятностей, хотя я хочу, чтобы RMagick соответствующим образом обрезал файл с S3. Вот текущий код (который не работает):Rails: обрезка изображений с помощью Paperclip, S3 и RMagick

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

+0

Где именно у вас проблемы? –

+0

У меня возникли проблемы с возвратом обрезанного изображения на S3 через скрепку. –

ответ

5

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

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 

Основной проблемой здесь является скорость хит создания нового временного файла , поэтому, вероятно, нам придется создать собственный собственный интерфейс. Надеюсь, это может стать хорошей отправной точкой для людей, решающих подобную проблему.

EDIT: Простое примечание, Tempfile является частью библиотек скрепки.

0

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

Проблема заключается в том, что он не учитывает координаты начала обрезки (x1, y1), а также ширину и высоту. –

0

Возможно, вы захотите более подробно ознакомиться с Paperclip processors.

У меня на самом деле такая же проблема в моем собственном коде, и у меня это в списке дел.

+0

Процессоры Paperclip на самом деле не будут работать гибким способом, так как мне нужно, чтобы параметры, переданные в хеше params, были правильно обрезаны, и нет реального способа передать параметры процессорам в paperclip. –

+0

Вы можете установить эти параметры в качестве атрибутов на модели и получить к нему доступ в своем процессоре, вызвав 'attachment.instance' в свой метод' # make'. –

Смежные вопросы