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