2011-12-21 24 views
9

Potrzebuję możliwości umieszczenia wymiarów przetworzonego obrazu.Pobieranie wysokości obrazu za pomocą CarrierWave

mam w ImageUploader klasy:

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

Czy istnieje sposób, że mogę dostać wymiarów obrazka podobne do tego?

height = @picture.image_height(:post) 

Odpowiedz

12

Można dostosować i wykorzystać metodę opisaną tutaj: http://code.dblock.org/carrierwave-saving-best-image-geometry

It dodaje proces, a następnie wywołuje metodę Magick, aby pobrać geometrię obrazu.

Kod:

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 Ta metoda jest dużo czystsza i jest podobna do zalecanej przez RMagick tutaj: http://www.imagemagick.org/RMagick/doc/comtasks.html – iwasrobbed

+0

Nie jestem tego pewien tutaj, ale pozwól mi polecić .ping zamiast .read (od http://stackoverflow.com/a/ 16267106/4738391) –

1

google jakiś wokół przyszedł na stanowisko z następujących czynności:

Link źródło 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

można zaczepić na: cache oraz: Metody retrieve_from_cache

Nie ma potrzeby, aby polegać na systemie poleceń albo:

# 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

Dzięki! Rozwiązanie oznaczone jako odpowiedź nie działa dla mnie. Ładne i proste rozwiązanie. –

+0

Należy pamiętać, że spowoduje to przechwycenie największej wielkości wersji. Możesz użyć https://github.com/gzigzigzeo/carrierwave-meta do obsługi wielu wersji (dodaje proces jak inne przykłady). Również to prawdopodobnie nie jest zbyt wydajne, ponieważ wydaje mi się, że używam tutaj 'binread', który czyta cały plik zamiast tylko nagłówka – glebm

Powiązane problemy