2009-12-09 18 views
10

Sto cercando un modo per determinare l'orientamento dell'immagine preferibilmente con Paperclip, ma è anche possibile o devo utilizzare RMagick o un'altra libreria di immagini per questo?Orientamento e convalida delle immagini con Paperclip?

Caso di scenario: quando un utente carica un'immagine, si desidera verificare l'orientamento/dimensioni/dimensioni per determinare se l'immagine è in verticale/orizzontale o quadrata e salvare questo attributo sul modello.

risposta

11

Ecco cosa generalmente faccio nei miei modelli di immagine. Forse sarà d'aiuto:

  • Io uso l'opzione IM -auto-oriente durante la conversione. Questo assicura immagini vengono sempre ruotate correttamente dopo caricamento
  • ho letto il EXIF data dopo la lavorazione e ottenere la larghezza e l'altezza (tra le altre cose)
  • si può quindi semplicemente avere un metodo di istanza che emette una stringa orientamento in base alla larghezza e altezza
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

Il callback non è chiamato 'after_post_process'? –

+0

È 'after_attachment_post_process' qui perché Paperclip ti permette di dichiarare post processori per ogni allegato nel tuo modello. Lo fai dichiarando 'after_ATTACHMENT-NAME_post_process'. Quindi se il suo allegato fosse chiamato 'media', il suo postprocessore sarebbe' after_media_post_process'. – Joseph

+0

Probabilmente vorrai usare 'source_file_options: {all: '-auto-orient'}' invece di 'convert_options:' poiché si orienta prima di generare i vari stili e produrrà le dimensioni dell'immagine previste nei tuoi stili. –

1

Quando scatto una foto con la fotocamera, le dimensioni dell'immagine sono le stesse indipendentemente se la foto è orizzontale o verticale. Tuttavia, la mia fotocamera è abbastanza intelligente per ruotare l'immagine per me! Che pensiero! Il modo in cui questo lavoro è che utilizza qualcosa chiamato exif data che è meta dati posizionati sull'immagine dalla fotocamera. Esso comprende cose come: il tipo di macchina fotografica, quando la foto è stata scattata, orientamento ecc ...

con graffetta è possibile impostare le richiamate, in particolare quello che si vorrà fare è avere una richiamata da before_post_process che controlla l'orientamento dell'immagine leggendo i dati exif utilizzando una libreria (è possibile trovare un elenco qui: http://blog.simplificator.com/2008/01/14/ruby-and-exif-data/) e quindi ruotando l'immagine in senso orario o antiorario di 90 gradi (non si saprà da che parte hanno ruotato la fotocamera quando hanno scattato la foto).

Spero che questo aiuti!

+0

ho guardato in questo ed è anche una grande soluzione, anche se questa volta il caricamento delle immagini sono di utenti e io in realtà non si fidano della loro capacità di caricare correttamente le immagini. –

5

Grazie per la risposta jonnii.

Anche se ho trovato quello che stavo cercando nel modulo PaperClip :: Geometry.

Questo lavorato ritrovamento:

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 

Questo naturalmente rende entrambe le immagini verticali e quadrati hanno l'attributo verticale, ma questo è quello che volevo in ogni caso.

Problemi correlati