2009-12-09 23 views
10

Tôi đang tìm cách xác định định hướng hình ảnh tốt nhất với Paperclip, nhưng liệu nó có khả thi hay tôi cần phải sử dụng RMagick hoặc một thư viện hình ảnh khác cho điều này?Định hướng và xác thực hình ảnh bằng Paperclip?

Kịch bản trường hợp: Khi người dùng tải lên hình ảnh tôi muốn kiểm tra hướng/kích thước/kích thước để xác định xem hình ảnh có ở dọc/ngang hoặc hình vuông hay không và lưu thuộc tính này vào mô hình.

Trả lời

11

Đây là những gì tôi thường làm trong các mô hình hình ảnh của mình. Có lẽ nó sẽ giúp:

  • Tôi sử dụng tùy chọn -auto-orient khi chuyển đổi. Điều này đảm bảo hình ảnh luôn được xoay vòng đúng cách sau khi tải lên
  • Tôi đọc EXIF data sau khi xử lý và lấy chiều rộng và chiều cao (trong số những thứ khác)
  • Sau đó bạn có thể có phương pháp thể hiện đầu ra chuỗi định hướng dựa trên chiều rộng và chiều cao
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

Không phải là cuộc gọi lại được gọi là 'after_post_process'? –

+0

Đó là 'after_attachment_post_process' ở đây vì Paperclip cho phép bạn khai báo các bộ xử lý bài cho mỗi phần đính kèm trong mô hình của bạn. Bạn làm điều đó bằng cách khai báo 'after_ATTACHMENT-NAME_post_process'. Vì vậy, nếu tập tin đính kèm của ông được gọi là 'phương tiện truyền thông', bộ xử lý bài của ông sẽ là 'after_media_post_process'. – Joseph

+0

Bạn có thể muốn sử dụng 'source_file_options: {all: '-auto-orient'}' thay vì 'convert_options:' vì nó trước khi tạo ra các kiểu khác nhau và sẽ tạo ra kích thước hình ảnh mong muốn trong kiểu của bạn. –

1

Khi tôi chụp ảnh bằng máy ảnh, kích thước của hình ảnh giống nhau bất kể ảnh có nằm ngang hay dọc. Tuy nhiên, máy ảnh của tôi đủ thông minh để xoay hình ảnh cho tôi! Chu đáo chưa kìa! Cách làm việc này là sử dụng một cái gì đó gọi là exif data là dữ liệu meta được đặt trên hình ảnh của máy ảnh. Nó bao gồm các công cụ như: các loại máy ảnh, khi ảnh đã được chụp, hướng vv ...

Với kẹp giấy, bạn có thể thiết lập callbacks, đặc biệt là những gì bạn sẽ muốn làm là có một callback trên before_post_process rằng kiểm tra hướng của hình ảnh bằng cách đọc dữ liệu exif bằng thư viện (bạn có thể tìm danh sách ở đây: http://blog.simplificator.com/2008/01/14/ruby-and-exif-data/), sau đó xoay hình ảnh theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ 90 độ (bạn sẽ không biết cách quay máy ảnh khi nào bức ảnh).

Tôi hy vọng điều này sẽ hữu ích!

+0

tôi nhìn vào trong này và nó cũng là một giải pháp tuyệt vời, mặc dù thời gian này, cập nhật hình ảnh là do người sử dụng và tôi không thực sự tin tưởng khả năng của họ để tải lên hình ảnh một cách chính xác. –

5

Cảm ơn câu trả lời jonnii.

Mặc dù tôi đã tìm thấy những gì tôi đang tìm kiếm trong mô-đun PaperClip :: Geometry.

này đã làm việc tìm:

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 

Điều này tất nhiên làm cho cả hai hình ảnh dọc và vuông có thuộc tính thẳng đứng nhưng đó là những gì tôi muốn anyway.

Các vấn đề liên quan