2011-12-21 14 views
9

Necesito la capacidad de poner las dimensiones de la imagen procesada.Recuperación de la altura de la imagen con CarrierWave

que tengo en mi clase ImageUploader:

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

¿Hay una manera que podría conseguir dimensiones de la imagen similar a esto?

height = @picture.image_height(:post) 

Respuesta

12

Puede ajustar y utilizar el método descrito aquí: http://code.dblock.org/carrierwave-saving-best-image-geometry

Se agrega un proceso y luego llama al método de Magick para obtener la geometría de la imagen.

Código:

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 Este método es mucho más limpio y es similar al recomendado por RMagick aquí: http://www.imagemagick.org/RMagick/doc/comtasks.html – iwasrobbed

+0

No estoy seguro de esto aquí, pero permítanme recomendar .ping en lugar de .read (desde http://stackoverflow.com/a/ 16267106/4738391) –

1

Busqué en Google alguna en torno a un vino en un post con lo siguiente:

enlace de la fuente 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

Puede engancharse en la: caché y: métodos retrieve_from_cache

No hay necesidad de confiar en el sistema de comandos, ya sea:

# 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

Gracias! La solución marcada como la respuesta no funcionó para mí. Buena y simple solución. –

+0

Tenga en cuenta que esto solo capturará el tamaño de la versión más grande. Puede usar https://github.com/gzigzigzeo/carrierwave-meta para soporte de versiones múltiples (agrega procesos como los otros ejemplos). Además, esto probablemente no sea muy eficiente ya que parece que estoy usando 'binread' aquí, que lee todo el archivo en lugar de solo el encabezado – glebm

Cuestiones relacionadas