Rails: Recadrage d'image avec Paperclip, S3 et RMagick
-
05-07-2019 - |
Question
J'essaie actuellement de coder un système de recadrage d'image personnalisé, similaire à d'autres systèmes disponibles sur Internet, où un utilisateur peut sélectionner une zone de recadrage puis faire rogner son image 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 que RMagick recadre correctement le fichier à partir de S3. Voici le code actuel (qui ne fonctionne pas):
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 problème principal est que l'image recadrée n'est pas téléchargée vers S3 par le biais d'un trombone et n'est donc pas correctement recadrée. Quelqu'un a-t-il déjà tenté quelque chose comme ça avec un trombone? Cela n’est peut-être même pas possible, mais toute aide serait grandement appréciée.
La solution
J'ai pu résoudre ce problème 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 ici est la rapidité avec laquelle nous avons créé un nouveau fichier temporaire. Nous devrons donc probablement créer notre propre interface personnalisée. Espérons que cela puisse être un bon point de départ pour les personnes qui résolvent un problème similaire.
EDIT: Juste une note rapide, Tempfile fait partie des bibliothèques de trombones.
Autres conseils
Vous pouvez définir certains attr_accessors sur le modèle et les définir dans l'action du contrôleur avant de créer le fichier réel. Les éléments ci-dessous devraient 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
Vous voudrez peut-être examiner de plus près processeurs Paperclip . .
En fait, j'ai le même problème dans mon propre code et je l'ai dans ma liste de tâches.