2009-12-09 13 views
10

Szukam sposobu na określenie orientacji obrazu najlepiej z Paperclip, ale czy jest to nawet możliwe, czy też potrzebuję do tego użytkownika RMagick lub innej biblioteki obrazów?Orientacja obrazu i sprawdzanie poprawności za pomocą Paperclip?

Scenariusz przypadku: gdy użytkownik przesyła obraz, chcę sprawdzić orientację/rozmiar/wymiary, aby określić, czy obraz jest w pionie/poziomie lub w kwadracie i zapisać ten atrybut w modelu.

Odpowiedz

11

Oto, co generalnie robię w moich modelach graficznych. Być może pomoże to:

  • Używam opcji IM -auto-orient podczas konwersji. To gwarantuje obrazy są zawsze obraca się prawidłowo po przesłaniu
  • czytam EXIF data po przetworzeniu i uzyskać szerokość i wysokość (między innymi)
  • Można wtedy po prostu metodę instancji generującego ciąg orientacji na podstawie szerokości i wysokości
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

Czy wywołanie zwrotne nie nazywa się 'after_post_process'? –

+0

Tutaj jest 'after_attachment_post_process', ponieważ Paperclip pozwala zadeklarować postprocesory dla każdego załącznika w twoim modelu. Robisz to deklarując 'after_ATTACHMENT-NAME_post_process'. Więc jeśli jego załącznik nazywa się "mediami", jego postprocesorem będzie "after_media_post_process". – Joseph

+0

Prawdopodobnie chcesz użyć 'source_file_options: {all: '-auto-orient'}' zamiast 'convert_options:', ponieważ poprzedza generowanie różnych stylów i stworzy oczekiwane rozmiary obrazów w twoich stylach. –

1

Kiedy robię zdjęcie aparatem, wymiary zdjęcia są takie same, niezależnie od tego, czy zdjęcie jest krajobrazowe czy portretowe. Jednak mój aparat jest wystarczająco inteligentny, aby obrócić obraz dla mnie! Jak troskliwie! Sposób, w jaki to działa, polega na użyciu czegoś o nazwie exif data, która jest metadanych umieszczonych na obrazie przez kamerę. Obejmuje ona rzeczy, jak: typ aparatu, kiedy zdjęcie zostało zrobione, orientację itp ...

Z spinacza można skonfigurować zwrotnych, a konkretnie co będziemy chcieli zrobić, to mieć wywołania zwrotnego na before_post_process że sprawdza orientację obrazu, odczytując dane exif za pomocą biblioteki (można znaleźć listę tutaj: http://blog.simplificator.com/2008/01/14/ruby-and-exif-data/), a następnie obracając obraz w prawo lub w lewo o 90 stopni (nie wiesz, w jaki sposób obróciły kamerę, gdy zostały zrobione zdjęcie).

Mam nadzieję, że to pomoże!

+0

zajrzałem do tego i jest to również świetne rozwiązanie, choć tym razem załadowania obrazu są przez użytkowników i naprawdę nie ufa ich zdolności do przesyłania obrazów poprawnie. –

5

Dzięki za odpowiedź jonnii.

Mimo że znalazłem to, czego szukałem w module PaperClip :: Geometry.

To działało znajdują się:

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 

To oczywiście sprawia, że ​​oba obrazy pionowe i kwadrat mają atrybut pionową, ale to, co chciałem i tak.

Powiązane problemy