2009-03-06 7 views
3

J'essaie actuellement de coder un système de recadrage d'image personnalisé similaire à d'autres sur Internet où un utilisateur peut sélectionner une zone de recadrage et ensuite avoir son image recadrée en conséquence. L'application est dans Rails et nous utilisons Paperclip avec Amazon S3 pour stocker les fichiers. J'ai beaucoup de mal à obtenir RMagick pour recadrer le fichier de S3. Voici le code actuel (qui ne fonctionne pas):Rails: Recadrage d'image avec Paperclip, S3 et 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 

Le principal problème est que l'image recadrée est pas téléchargée sur le nouveau S3 par paperclip, et donc pas correctement recadrée. Est-ce que quelqu'un a déjà essayé quelque chose comme ça avec un trombone? Cela peut même pas possible, mais toute aide serait grandement appréciée.

+0

Où avez-vous des problèmes exactement? –

+0

Je n'arrive pas à transférer l'image recadrée vers S3 via un trombone. –

Répondre

5

Je suis en mesure de résoudre ce problème pour le moment comme suit:

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 

La principale préoccupation est ici le coup de la vitesse de création d'un nouveau fichier temporaire , donc nous devrons probablement créer notre propre interface personnalisée. Espérons que cela peut être un bon point de départ pour les personnes qui résolvent un problème similaire.

EDIT: Juste un petit mot, Tempfile fait partie des librairies paperclip.

0

Vous pouvez définir des attributs attr_accessors sur le modèle et les définir dans l'action du contrôleur avant de créer le fichier réel. Le ci-dessous devrait fonctionner ..

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

Le problème avec ceci est qu'il ne prend pas en compte les coordonnées de début de recadrage (x1, y1), juste la largeur et la hauteur. –

0

Vous voudrez peut-être regarder de plus près à Paperclip processors.

J'ai effectivement le même problème dans mon propre code, et je l'ai sur ma liste de choses à faire.

+0

Les processeurs Paperclip ne fonctionneront pas vraiment de manière flexible, car j'ai besoin que les paramètres passés dans le hachage des paramètres soient correctement recadrés et qu'il n'y ait pas de véritable moyen de transmettre les paramètres aux processeurs dans un trombone. –

+0

Vous pouvez définir ces paramètres en tant qu'attributs sur le modèle et y accéder dans votre processeur en appelant 'attachment.instance' dans votre méthode' # make'. –

Questions connexes