2009-12-09 9 views
10

Ich suche nach einer Möglichkeit, die Bildausrichtung vorzugsweise mit Paperclip zu bestimmen, aber ist das überhaupt möglich oder muss ich RMagick oder eine andere Bildbibliothek dafür benutzen?Bildausrichtung und Validierung mit Paperclip?

Fallszenario: Wenn ein Benutzer ein Bild hochlädt, überprüfe ich die Ausrichtung/Größe/Abmessungen, um festzustellen, ob das Bild im Hochformat/Querformat oder Quadrat ist und speichere dieses Attribut im Modell.

Antwort

11

Hier ist, was ich im Allgemeinen in meinen Bildmodellen mache. Vielleicht wird es helfen:

  • Ich verwende IM-Auto-Orient-Option beim Konvertieren. Dadurch wird sichergestellt, Bilder immer richtig nach dem Hochladen
  • gedreht ich die EXIF data nach der Verarbeitung zu lesen und die Breite und Höhe erhalten (unter anderem)
  • Sie können dann nur eine Instanz Methode, die eine Orientierung Zeichenfolge ausgibt basierend auf Breite und Höhe
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

10 Wird der Callback nicht 'after_post_process' genannt? –

+0

Es ist 'after_attachment_post_process' hier, weil Sie mit Paperclip Postprozessoren für jeden Anhang in Ihrem Modell deklarieren können. Sie tun dies, indem Sie 'after_ATTACHMENT-NAME_post_process' deklarieren. Wenn also sein Anhang "media" heißt, wäre sein Postprozessor 'after_media_post_process'. – Joseph

+0

Wahrscheinlich möchten Sie 'source_file_options: {all: '-auto-orient'}' anstelle von 'convert_options:' verwenden, da es vor der Erzeugung der verschiedenen Stile orientiert ist und die erwarteten Bildgrößen in Ihren Stilen erzeugt. –

1

Wenn ich ein Foto mit meiner Kamera mache, sind die Abmessungen des Bildes gleich, egal ob das Foto im Quer- oder Hochformat ist. Allerdings ist meine Kamera schlau genug, um das Bild für mich zu drehen! Wie rücksichtsvoll! Die Art, wie diese Arbeit ist, verwendet etwas namens exif data, das sind Metadaten, die von der Kamera auf das Bild gelegt werden. Es enthält Sachen wie: die Art der Kamera, wenn das Foto aufgenommen wurde, Orientierung etc ...

Mit Büroklammer Sie Rückrufe einrichten können, speziell, was Sie ist einen Rückruf auf before_post_process zu tun haben wollen, dass überprüft die Ausrichtung des Bildes durch Lesen der exif-Daten mit Hilfe einer Bibliothek (Sie finden eine Liste hier: http://blog.simplificator.com/2008/01/14/ruby-and-exif-data/), und drehen Sie dann das Bild im oder gegen den Uhrzeigersinn um 90 Grad (Sie werden nicht wissen, in welche Richtung sie die Kamera gedreht haben das Foto).

Ich hoffe, das hilft!

+0

ich in diese sah und es ist auch eine gute Lösung, wenn auch dieses Mal die Bild-Uploads von Nutzern sind und ich traue nicht wirklich ihre Fähigkeit, Bilder richtig zu laden. –

5

Danke für die Antwort jonnii.

Obwohl ich finde, was ich im PaperClip :: Geometry-Modul gesucht habe.

Dieser Fund gearbeitet:

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 

Das macht natürlich sowohl vertikale als auch quadratische Bilder die vertikale Attribut haben, aber das ist, was sowieso ich wollte.

Verwandte Themen