2009-12-09 5 views
10

Je cherche un moyen de déterminer l'orientation de l'image de préférence avec Paperclip, mais est-ce même possible ou ai-je besoin d'user RMagick ou une autre bibliothèque d'images pour cela? Scénario de cas: Lorsqu'un utilisateur télécharge une image, je souhaite vérifier l'orientation/la taille/les dimensions pour déterminer si l'image est en mode portrait/paysage ou carré et enregistrer cet attribut dans le modèle.Orientation de l'image et validation avec Paperclip?

Répondre

11

Voici ce que je fais généralement dans mes modèles d'image. Peut-être que cela va aider:

  • J'utilise l'option -auto-orient de MI lors de la conversion. Cela garantit des images tournent toujours correctement après le téléchargement
  • j'ai lu le EXIF data après le traitement et obtenir la largeur et la hauteur (entre autres)
  • Vous pouvez alors juste une méthode d'instance qui délivre une chaîne d'orientation en fonction de la largeur et de la hauteur
has_attached_file :attachment, 
    :styles => { 
    :large => "900x600>", 
    :medium => "600x400>", 
    :square => "100x100#", 
    :small => "300x200>" }, 
    :convert_options => { :all => '-auto-orient' }, 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :s3_permissions => 'public-read', 
    :s3_protocol => 'https', 
    :path => "images/:id_partition/:basename_:style.:extension" 

after_attachment_post_process :post_process_photo 

def post_process_photo 
    imgfile = EXIFR::JPEG.new(attachment.queued_for_write[:original].path) 
    return unless imgfile 

    self.width   = imgfile.width    
    self.height  = imgfile.height    
    self.model   = imgfile.model    
    self.date_time  = imgfile.date_time   
    self.exposure_time = imgfile.exposure_time.to_s 
    self.f_number  = imgfile.f_number.to_f  
    self.focal_length = imgfile.focal_length.to_s 
    self.description = imgfile.image_description 
end 
+1

Le rappel n'est-il pas appelé 'after_post_process'? –

+0

Ici, c'est 'after_attachment_post_process' parce que Paperclip vous permet de déclarer des post-processeurs pour chaque pièce jointe de votre modèle. Vous le faites en déclarant 'after_ATTACHMENT-NAME_post_process'. Donc, si son attachement s'appelait 'media', son post-processeur serait' after_media_post_process'. – Joseph

+0

Vous voudrez probablement utiliser 'source_file_options: {all: '-auto-orient'}' au lieu de 'convert_options:' car il oriente avant de générer les différents styles et produira les tailles d'image attendues dans vos styles. –

1

Lorsque je prends une photo avec mon appareil photo, les dimensions de l'image sont les mêmes, que la photo soit en mode paysage ou portrait. Cependant, mon appareil photo est assez intelligent pour faire pivoter l'image pour moi! Comme c'est gentil! La façon dont ce travail est qui utilise quelque chose appelé exif data qui est des métadonnées placées sur l'image par la caméra. Il comprend des choses comme: le type de caméra, lorsque la photo a été prise, orientation etc ...

Avec paperclip vous pouvez configurer callbacks, plus précisément ce que vous voulez faire est d'avoir un rappel sur before_post_process que vérifie l'orientation de l'image en lisant les données exif en utilisant une bibliothèque (vous pouvez trouver une liste ici: http://blog.simplificator.com/2008/01/14/ruby-and-exif-data/), puis en tournant l'image dans le sens horaire ou antihoraire de 90 degrés (vous ne saurez pas dans quelle direction ils ont tourné la caméra la photo).

J'espère que cela aide!

+0

j'ai regardé cela et il y a aussi une excellente solution, bien que cette fois les ajouts d'images sont par les utilisateurs et je ne vraiment pas confiance en leur capacité de télécharger des images correctement. –

5

Merci pour la réponse jonnii. Bien que j'ai trouvé ce que je cherchais dans le module PaperClip :: Geometry.

Cela a trouver:

class Image < ActiveRecord::Base 
    after_save :set_orientation 

    has_attached_file :data, :styles => { :large => "685x", :thumb => "100x100#" } 
    validates_attachment_content_type :data, :content_type => ['image/jpeg', 'image/pjpeg'], :message => "has to be in jpeg format" 

    private 
    def set_orientation 
    self.orientation = Paperclip::Geometry.from_file(self.data.to_file).horizontal? ? 'horizontal' : 'vertical' 
    end 
end 

Bien sûr, rend les deux images verticales et carrées ont l'attribut vertical mais c'est ce que je voulais de toute façon.

Questions connexes