2009-03-06 14 views
3

Ich versuche gerade ein benutzerdefiniertes Bildbeschneidungssystem ähnlich zu anderen im Internet zu programmieren, wo ein Benutzer einen Zuschnittbereich auswählen und dann ihr Bild entsprechend beschnitten werden kann. Die Anwendung ist in Rails und wir verwenden Paperclip mit Amazon S3, um die Dateien zu speichern. Ich habe eine Menge Probleme, obwohl RMagick die Datei von S3 entsprechend beschneiden sollte. Hier ist der aktuelle Code (was nicht funktioniert):Schienen: Bild beschneiden mit Büroklammer, S3 und 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 

Das Hauptproblem ist, dass das beschnittene Bild nicht zurück zu S3 durch Büroklammer hochgeladen wird, und somit nicht richtig abgeschnitten. Hat jemand schon mal so etwas mit Büroklammer versucht? Dies ist möglicherweise nicht einmal möglich, aber jede Hilfe würde sehr geschätzt werden.

+0

Wo genau haben Sie Probleme? –

+0

Ich habe Probleme, das zugeschnittene Bild über die Büroklammer zurück auf S3 zu bringen. –

Antwort

5

Ich habe in der Lage, dieses Problem für den Augenblick zu lösen, wie folgt:

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 

Das Hauptanliegen ist dabei die Geschwindigkeit Hit eine neue temporäre Datei erstellen wahrscheinlich müssen wir unsere eigene benutzerdefinierte Schnittstelle erstellen. Hoffentlich kann dies ein guter Ausgangspunkt für Leute sein, die ein ähnliches Problem lösen.

EDIT: Nur eine kurze Notiz, Tempfile ist Teil der Paperclip-Bibliotheken.

0

Sie könnten einige attr_accessors im Modell definieren und sie in der Controller-Aktion festlegen, bevor Sie die eigentliche Datei erstellen. Die unten sollte funktionieren ..

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

Das Problem dabei ist, dass die Startkoordinaten (x1, y1) nicht berücksichtigt werden, sondern nur die Breite und Höhe. –

0

Sie können sich die Paperclip processors genauer ansehen.

Ich habe eigentlich das gleiche Problem in meinem eigenen Code, und habe das auf meiner Todo-Liste.

+0

Paperclip-Prozessoren werden nicht wirklich auf eine flexible Art und Weise dafür arbeiten, da ich Parameter, die im Params-Hash übergeben werden, richtig beschneiden muss und es keine Möglichkeit gibt, Parameter an Prozessoren in Paperclip zu übergeben. –

+0

Sie können diese Parameter als Attribute für das Modell festlegen und in Ihrem Prozessor darauf zugreifen, indem Sie 'attachment.instance' in Ihrer Methode' # make' aufrufen. –

Verwandte Themen