Carrierwave y mini_magick encontrando anchos y alturas

Después de un poco de investigación, decidí usar Carrierwave y mini_magick en mi nueva aplicación rail3.

Lo he configurado y funciona perfectamente. Sin embargo tengo una pregunta. Me gustaría poder acceder a la anchura y la altura, por lo que puedo configurar el html correctamente. Sin embargo, no hay datos predeterminados de los cuales obtener esta información. Debido a la forma en que almacena los datos, no se me ocurre ninguna forma de agregarlos a la base de datos.

¿Alguien puede sugerir algún consejo o ideas? ¿Es incluso posible?

class Attachment mount_uploader :file, FileUploader def image @image ||= MiniMagick::Image.open(file.path) end end 

Y úsalo así:

 Attachment.first.image['width'] # => 400 Attachment.first.image['height'] # => 300 

Solo para el registro, he usado una solución similar, sin embargo, utilizando archivos con Mongo GridFS, aquí va:

  def image @image ||= MiniMagick::Image.read(Mongo::GridFileSystem.new(Mongoid.database).open(file.path, 'r')) end 

Desventaja de calcular el height / width usando RMagick o MiniMagick en tiempo de ejecución:

  • Su CPU intensiva
  • Requiere internet para obtener imagen y calcular las dimensiones.
  • Es un proceso lento

Para su información, también puede calcular la Height la imagen, el Width después de que la imagen se haya cargado completamente utilizando el evento load asociado con la etiqueta con la ayuda de jQuery.

Por ejemplo :

 $(document).ready(function(){ var $image = $('.fixed-frame img'); $image.load(function(){ rePositionLogo($image); }); if($image.prop('complete')){ rePositionLogo($image); } }); function rePositionLogo($image){ var height = $image.height(); var width = $image.width(); if (width > height) { $image.parents('.header').addClass('landscape'); var marginTop = (105 - $image.height())/2; $image.css('margin-top', marginTop + 'px') }else{ $image.parents('.header').addClass('portrait'); } } 

Tenga cuidado, porque load() no se activará cuando ya se haya cargado una imagen. Esto puede suceder fácilmente cuando una imagen está en el cache del navegador del usuario.

Puede verificar si una imagen ya está cargada usando $('#myImage').prop('complete') , que devuelve true cuando se carga una imagen.

Creo que la mejor manera es almacenar las dimensiones de la imagen en el modelo (base de datos).

En mi caso, el nombre del modelo es attachment . Entonces creé una migración:

 rails g migration add_dimensions_to_attachments image_width:integer image_height:integer 

Después de eso, ejecute la migración:

 rake db:migrate 

En mi app/uploaders/image_uploader.rb archivo de Image Uploader, tengo:

 class ImageUploader < CarrierWave::Uploader::Base include CarrierWave::MiniMagick process :store_dimensions private def store_dimensions if file && model model.image_width, model.image_height = ::MiniMagick::Image.open(file.file)[:dimensions] end end end 

Con esto, las dimensiones de la imagen se guardan en el paso de carga.

Para obtener las dimensiones, simplemente ejecuto attachment.image_width o attachment.image_height

Vea la referencia aquí .