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
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
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!
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. –
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.
- 1. Validation conditionnelle avec Paperclip difficile
- 2. mod_rails et le problème Paperclip Paperclip :: NotIdentifiedByImageMagickError
- 3. Importation d'anciennes données avec Rails et Paperclip
- 4. accepte_nested_attributes_for en combinaison avec formtastic et paperclip
- 5. Problèmes avec l'interface Orientation et UITabBarController
- 6. BrowserCMS et Paperclip
- 7. Rails3 et Paperclip
- 8. Paperclip et xhr.sendAsBinary
- 9. orientation objet et sérialisation
- 10. simple recadrage avec Paperclip
- 11. Capturer la longueur de la vidéo avec FFMPEG et Paperclip
- 12. Paperclip fichiers versioning avec vestal_versions
- 13. Paperclip et Amazon S3 Édition
- 14. WPF TreeView avec orientation horizontale?
- 15. Upload image avec Paperclip problème
- 16. images préchargement avec Paperclip (Rails)
- 17. PHP, jQuery et Ajax Orientation de l'objet
- 18. Angles d'Euler et orientation Quaternion
- 19. plus intelligents validations Paperclip
- 20. Changer de vue avec une orientation différente
- 21. à l'aide des fichiers sécurisés avec paperclip et non sécurisés
- 22. Rails: Recadrage d'image avec Paperclip, S3 et RMagick
- 23. Comment recadrer et remplir avec Paperclip (ou RMagick)?
- 24. probem avec paperclip accepter JPG et PNG sur la production
- 25. Paperclip téléversements d'images dans Rails - Paperclip :: CommandNotFoundError
- 26. validations paperclip
- 27. Orientation optimale
- 28. UIImagePickerController Orientation de l'image
- 29. Ruby: Paperclip, S3, et clonage en profondeur
- 30. Orientation de l'interface iPad
Le rappel n'est-il pas appelé 'after_post_process'? –
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
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. –