2011-12-21 49 views
9

Tôi cần có khả năng đặt thứ nguyên của hình ảnh đã xử lý.Lấy chiều cao hình ảnh bằng CarrierWave

tôi có trong lớp ImageUploader tôi:

version :post do 
    process :resize_to_fit => [200, nil] 
end 

Có cách nào mà tôi có thể nhận được kích thước của hình ảnh tương tự như này?

height = @picture.image_height(:post) 

Trả lời

12

Bạn có thể điều chỉnh và sử dụng phương pháp mô tả ở đây: http://code.dblock.org/carrierwave-saving-best-image-geometry

Nó thêm một quá trình sau đó gọi phương thức của Magick để tìm nạp hình ảnh hình học.

Code:

version :post do 
    process :resize_to_fit => [200, nil] 
    process :get_geometry 

    def geometry 
     @geometry 
    end 
    end 

    def get_geometry 
    if (@file) 
     img = ::Magick::Image::read(@file.file).first 
     @geometry = [ img.columns, img.rows ] 
    end 
    end 
+1

+1 Phương pháp này sạch hơn rất nhiều và tương tự như phương pháp được RMagick đề xuất ở đây: http://www.imagemagick.org/RMagick/doc/comtasks.html – iwasrobbed

+0

Tôi không chắc chắn về điều này ở đây, nhưng hãy để tôi khuyên bạn nên .ping thay vì .read (từ http://stackoverflow.com/a/ 16267106/4738391) –

1

i googled một số khoảng một đến vào một bài như sau:

liên kết nguồn http://groups.google.com/group/carrierwave/browse_thread/thread/c5e93b45bde8a85e?fwc=1&pli=1

class HeaderUploader < CarrierWave::Uploader::Base 
    storage :right_s3 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    def url 
    ["http://#{s3_bucket}.s3.amazonaws.com/", path].compact.join 
    end 
    before :cache, :capture_size_before_cache 
    before :retrieve_from_cache, :capture_size_after_retrieve_from_cache 
    def capture_size_before_cache(new_file) 
    model.header_width, model.header_height = `identify -format "%wx 
%h" #{new_file.path}`.split(/x/) 
    end 
    def capture_size_after_retrieve_from_cache(cache_name) 
    model.header_width, model.header_height = `identify -format "%wx 
%h" #[email protected]}`.split(/x/) 
    end 
    def dimensions 
    "#{model.header_width}x#{model.header_height}" 
    end 
end 
7

Bạn có thể treo lên: bộ nhớ cache và: phương pháp retrieve_from_cache

Không cần phải dựa vào hệ thống các lệnh hoặc:

# Somewhere in your uploader: 
attr_reader :geometry 
after :cache, :capture_size 
after :retrieve_from_cache, :capture_size 
def capture_size(*args)  
    img = ::MiniMagick::Image::read(File.binread(@file.file)) 
    @geometry = [img[:width], img[:height]] 
end 

http://www.glebm.com/2012/05/carrierwave-image-dimensions.html

+0

Xin cảm ơn! Các giải pháp đánh dấu là câu trả lời đã không làm việc cho tôi. Giải pháp tốt và đơn giản. –

+0

Xin lưu ý rằng điều này sẽ chỉ ghi lại kích thước của phiên bản lớn nhất. Bạn có thể sử dụng https://github.com/gzigzigzeo/carrierwave-meta để được hỗ trợ nhiều phiên bản (nó thêm quy trình giống như các ví dụ khác). Điều này có lẽ không hiệu quả lắm vì dường như tôi đang sử dụng 'binread' ở đây, nó đọc toàn bộ tệp thay vì chỉ tiêu đề – glebm

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