tutorial thoughtbot rails imagenes ruby-on-rails image-processing paperclip

ruby on rails - thoughtbot - ¿Orientación y validación de la imagen con Paperclip?



thoughtbot github (3)

Cuando tomo una foto con mi cámara, las dimensiones de la imagen son las mismas independientemente de si la foto es horizontal o vertical. Sin embargo, mi cámara es lo suficientemente inteligente como para rotar la imagen por mí. ¡Que pensativo! La forma en que este trabajo es que utiliza algo llamado exif data que son metadatos colocados en la imagen por la cámara. Incluye cosas como: el tipo de cámara, cuándo se tomó la foto, orientación , etc.

Con clip para papel puede configurar devoluciones de llamadas, específicamente lo que usted querrá hacer es tener una devolución de llamada en before_post_process que verifique la orientación de la imagen leyendo los datos exif usando una biblioteca (puede encontrar una lista aquí: http: // blog .simplificator.com / 2008/01/14 / ruby-and-exif-data / ), y luego girando la imagen en sentido horario o antihorario 90 grados (no sabrá en qué dirección giraron la cámara cuando tomaron la foto).

¡Espero que esto ayude!

Estoy buscando una forma de determinar la orientación de la imagen preferiblemente con Paperclip, pero ¿es posible o necesito usar RMagick u otra biblioteca de imágenes para esto?

Escenario de caso: cuando un usuario sube una imagen, quiero verificar la orientación / tamaño / dimensiones para determinar si la imagen está en vertical, horizontal o cuadrada y guardar este atributo en el modelo.


Gracias por la respuesta jonnii.

Aunque encontré lo que estaba buscando en el módulo PaperClip :: Geometry.

Este hallazgo funcionó:

class Image < ActiveRecord::Base after_save :set_orientation has_attached_file :data, :styles => { :large => "685x", :thumb => "100x100#" } validates_attachment_content_type :data, :content_type => [''image/jpeg'', ''image/pjpeg''], :message => "has to be in jpeg format" private def set_orientation self.orientation = Paperclip::Geometry.from_file(self.data.to_file).horizontal? ? ''horizontal'' : ''vertical'' end end

Esto, por supuesto, hace que las imágenes verticales y cuadradas tengan el atributo vertical, pero eso es lo que quería de todos modos.


Esto es lo que generalmente hago en mis modelos de imagen. Quizás ayude:

  • Uso la opción de orientar de mensajería instantánea al convertir. Esto garantiza que las imágenes siempre se roten correctamente después de la carga
  • Leo los datos EXIF después del procesamiento y obtengo el ancho y la altura (entre otras cosas)
  • A continuación, puede tener un método de instancia que genera una cadena de orientación en función del ancho y la altura

has_attached_file :attachment, :styles => { :large => "900x600>", :medium => "600x400>", :square => "100x100#", :small => "300x200>" }, :convert_options => { :all => ''-auto-orient'' }, :storage => :s3, :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", :s3_permissions => ''public-read'', :s3_protocol => ''https'', :path => "images/:id_partition/:basename_:style.:extension" after_attachment_post_process :post_process_photo def post_process_photo imgfile = EXIFR::JPEG.new(attachment.queued_for_write[:original].path) return unless imgfile self.width = imgfile.width self.height = imgfile.height self.model = imgfile.model self.date_time = imgfile.date_time self.exposure_time = imgfile.exposure_time.to_s self.f_number = imgfile.f_number.to_f self.focal_length = imgfile.focal_length.to_s self.description = imgfile.image_description end