2009-12-09 19 views
10

Estoy buscando una manera 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?¿Orientación de imagen y validación con Paperclip?

Caso de ejemplo: cuando un usuario carga 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.

Respuesta

11

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

  • Utilizo la opción de IM-orientar al convertir. Esto garantiza que las imágenes siempre se giran correctamente después de cargar
  • leí el EXIF data después del procesamiento y obtener la anchura y altura (entre otras cosas)
  • continuación, puede simplemente tener un método de instancia que da salida a una cadena de orientación basado en la anchura 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 
+1

¿No es la devolución de llamada llamada 'after_post_process'? –

+0

Aquí está 'after_attachment_post_process' porque Paperclip le permite declarar post procesadores para cada archivo adjunto en su modelo. Lo haces al declarar 'after_ATTACHMENT-NAME_post_process'. Entonces, si su archivo adjunto se llama 'media', su post procesador sería' after_media_post_process'. – Joseph

+0

Probablemente desee utilizar 'source_file_options: {all: '-auto-orient'}' en lugar de 'conversion_options:' ya que orienta antes de generar los diversos estilos y producirá los tamaños de imagen esperados en sus estilos. –

1

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

Con un clip puede configurar devoluciones de llamada, específicamente lo que usted querrá hacer es tener una devolución de llamada en la que before_post_process comprueba 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!

+0

miré en esto y también es una gran solución, aunque esta vez los archivos de imagen son los usuarios y yo realmente no confían en su capacidad para subir imágenes correctamente. –

5

Gracias por la respuesta jonnii.

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

Esto funcionó hallazgo:

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 

Por supuesto, esto hace que las dos imágenes verticales y cuadrados tienen el atributo vertical, pero eso es lo que quería de todos modos.

Cuestiones relacionadas