2010-05-04 28 views
16

Cố gắng lấy chiều rộng và chiều cao của hình ảnh được tải lên trong khi vẫn còn trong mô hình lưu ban đầu.Nhận chiều rộng và chiều cao của hình ảnh trong mô hình trong HƯỚNG DẪN GIÚP GEM

Bất kỳ cách nào để thực hiện việc này?

Đây là đoạn mã tôi đã thử nghiệm từ mô hình của mình. Tất nhiên nó không thành công trên "instance.photo_width".

has_attached_file :photo, 
         :styles => { 
         :original => "634x471>", 
         :thumb => Proc.new { |instance|      
            ratio = instance.photo_width/instance.photo_height 
            min_width = 142 
            min_height = 119 
            if ratio > 1 
            final_height = min_height 
            final_width = final_height * ratio 
            else 
            final_width = min_width 
            final_height = final_width * ratio 
            end 
            "#{final_width}x#{final_height}" 
           } 
        }, 
        :storage => :s3, 
        :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
        :path => ":attachment/:id/:style.:extension", 
        :bucket => 'foo_bucket' 

Vì vậy, về cơ bản, tôi cố gắng làm điều này để có chiều rộng và chiều cao hình thu nhỏ tùy chỉnh dựa trên kích thước hình ảnh ban đầu.

Bất kỳ ý tưởng nào?

Trả lời

25

Ahh, đã tìm ra. Tôi chỉ cần thực hiện một proc.

Dưới đây là đoạn code từ mô hình của tôi:

class Submission < ActiveRecord::Base 

    #### Start Paperclip #### 

    has_attached_file :photo, 
        :styles => { 
         :original => "634x471>", 
         :thumb => Proc.new { |instance| instance.resize } 
        }, 
        :storage => :s3, 
        :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
        :path => ":attachment/:id/:style.:extension", 
        :bucket => 'foo_bucket' 

    #### End Paperclip #### 

    def resize  
    geo = Paperclip::Geometry.from_file(photo.to_file(:original)) 

    ratio = geo.width/geo.height 

    min_width = 142 
    min_height = 119 

    if ratio > 1 
     # Horizontal Image 
     final_height = min_height 
     final_width = final_height * ratio 
     "#{final_width.round}x#{final_height.round}!" 
    else 
     # Vertical Image 
     final_width = min_width 
     final_height = final_width * ratio 
     "#{final_height.round}x#{final_width.round}!" 
    end 
    end 
end 
+0

Thanks, điều này đã giúp tôi có được chiều cao hình ảnh mà cho phép tôi để tự động đặt một hạn chế chiều cao trên một div mà tổ chức một bức tranh và chận đứng divs từ thay đổi kích thước khi trang được tải lại :) – s84

+0

Các bạn đã cố gắng để có được điều này để làm việc khi bạn đang sử dụng lưu trữ Amazon S3? Phương pháp của bạn hoạt động tốt cho những thứ được lưu trữ cục bộ, nhưng khi tôi thử nó trên một cái gì đó được lưu trữ trong S3, tôi nhận được một lỗi nói rằng đối tượng đó không được nhận dạng bởi lệnh 'xác định'. Có suy nghĩ gì không? Cảm ơn! – wuliwong

+0

Chỉ cần theo dõi, tôi đã tìm thấy http://stackoverflow.com/questions/3160788/can-paperclip-read-photo-geometry-off-an-s3-bucket Và bây giờ tôi đã đọc lại ví dụ của bạn, tôi thấy bạn bao gồm tệp .to_file để làm việc với bộ nhớ S3. Vì vậy, về cơ bản, chỉ giả vờ tôi không bao giờ nói bất cứ điều gì. Cảm ơn! – wuliwong

0
class Asset 

include Mongoid::Paperclip 
before_save :extract_dimensions 

field :width, type: Integer 
field :height, type: Integer 

has_mongoid_attached_file :data 

    def extract_dimensions 
    return unless is_image? 

    tempfile = data.queued_for_write[:original] 
    unless tempfile.nil? 
     geometry = Paperclip::Geometry.from_file(tempfile) 
     self.width = geometry.width.to_i 
     self.height = geometry.height.to_i 
    end 

    true # wont save if false 
    end 

    def is_image? 
    data_content_type =~ %r{^(image|(x-)?application)/(bmp|gif|jpeg|jpg|pjpeg|png|x-png)$} 
    end 

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