31 votes

paperclip - Enregistrement des images Dimensions ? width,height

Bonjour ? Y a-t-il des magiciens de paper_clip qui savent s'il est possible, lorsqu'on utilise paperclip pour enregistrer une image, d'enregistrer également les dimensions de l'image (largeur et hauteur) dans deux champs supplémentaires ? Comment obtient-on ces données lors du processus de téléchargement du trombone ?

Gracias

61voto

Nikita Rybak Points 36641

Par souci d'exhaustivité, même si les réponses précédentes présentent déjà d'assez bonnes suggestions.
Vous pouvez utiliser les gestionnaires d'événements de paperclip au lieu des callbacks de Rails. Dans ce cas, la taille sera recalculée uniquement lorsque l'image change. (Si vous utilisez S3 pour le stockage, cela peut vous faire gagner beaucoup de temps).

  has_attached_file :image, :styles => ...
  after_post_process :save_image_dimensions

  def save_image_dimensions
    geo = Paperclip::Geometry.from_file(image.queued_for_write[:original])
    self.image_width = geo.width
    self.image_height = geo.height
  end

L'image n'a même pas besoin d'être téléchargée depuis S3 (ou lue depuis un fichier), paperclip la fournit au gestionnaire d'événement lui-même.

Ver Événements section de le readme pour les détails.

5voto

Justin Tanner Points 5437

Lorsqu'un utilisateur télécharge une image avec paperclip, je la traite avec le modèle suivant :

class Picture < ActiveRecord::Base
  has_attached_file :pic, :styles => { :small => "100x100>" }, :whiny => true
  after_save :save_geometry

  def save_geometry
    unless @geometry_saved
      self.original_geometry = get_geometry(:original)
      self.small_geometry = get_geometry(:small)
      @geometry_saved = true
      self.save
    end
  end

  def get_geometry(style = :original)
    begin
      Paperclip::Geometry.from_file(pic.path(style)).to_s
    rescue
      nil
    end
  end
end

El get_geometry appelle la fonction ImageMagick identify pour trouver la géométrie de vos images originales et redimensionnées.

Je mets les résultats en cache dans un champ de la base de données. Par exemple, si j'ai téléchargé une image qui était 1024x768 mes champs en cache contiendraient :

original_geometry = "1024x768"
small_geometry = "100x75"

0voto

jordinl Points 3225

Vous aurez besoin de 'RMagick'.

uploaded_image = Magick::Image.read(image).first  #image is what you've specified in paperclip to be your image
width = uploaded_image.columns
height = uploaded_image.rows

Je ne suis pas sûr de savoir comment le faire fonctionner avec les rappels, cependant. Peut-être quelque chose comme :

attr_accessor :write_image_dimensions?
before_save :check_image_changed

def check_image_changed
  self.write_image_dimensions? = image_changed?
end

after_save :write_image_dimensions, :if => :write_image_dimensions?

def write_image_dimensions
  uploaded_image = Magick::Image.read(image).first  #image is what you've specified in paperclip to be your image
  self.width = uploaded_image.columns
  self.height = uploaded_image.rows
  save
end

-2voto

Roman Points 7430

Je pense qu'une telle fonctionnalité n'existe pas dans paperclip. Si vous voulez l'ajouter, vous devrez probablement modifier la méthode 'assign' dans lib/paperclip/attachment.rb, où vous pouvez obtenir la géométrie en utilisant Paperclip::Geometry.from_file.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X