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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top