2012-08-07 47 views

Respuesta

27

¿Has probado exifr gem a try? De la documentación

EXIFR::JPEG.new('IMG_6841.JPG').width    # => 2272 
EXIFR::JPEG.new('IMG_6841.JPG').height    # => 1704 
EXIFR::JPEG.new('IMG_6841.JPG').exif?    # => true 
EXIFR::JPEG.new('IMG_6841.JPG').model    # => "Canon PowerShot G3" 
EXIFR::JPEG.new('IMG_6841.JPG').date_time   # => Fri Feb 09 16:48:54 +0100 2007 
EXIFR::JPEG.new('IMG_6841.JPG').exposure_time.to_s # => "1/15" 
EXIFR::JPEG.new('IMG_6841.JPG').f_number.to_f  # => 2.0 
+0

Gracias Kulbir Saini, por exif gems su funcionamiento. –

+0

after_photo_post_process: copy_exif_data privada def copy_exif_data Exif = EXIFR :: JPEG.new (photo.queued_for_write [: el original]) self.exif_value = Exif final este código está trabajando que yo estoy acostumbrado. –

+0

Pregunta actualizada con el código final. Será visible después de la aprobación. –

5

Usted puede tratar de la gema mini_exiftool, un contenedor para la herramienta de línea de comandos exiftool.

Mientras que la gema requiere que realmente instales la herramienta de línea de comandos, el resultado es que obtienes un lote más poder. En comparación con exifr, que solo ofrece compatibilidad con archivos JPG y TIF, exiftool admite huge number of file formats. También admite la lectura de y escribiendo datos exif, mientras que exifr solo admite la lectura.

0
after_photo_post_process :copy_exif_data 
    private 
    def copy_exif_data 
    exif =EXIFR::JPEG.new(photo.queued_for_write[:original]) 
    self.exif_value = exif 
    end 

Este es el código de trabajo que se utiliza.

8

Hay 3 gemas para hacer esto:

  1. mini_exiftool: de línea de comandos ExifTool envoltorio
  2. exifr: Puro Rubí
  3. exif: C Extensión (por mí)

Si Si desea escribir o editar la etiqueta EXIF, debe elegir mini_exiftool, es más potente pero muy lento, como el índice de referencia que se muestra a continuación, exif es 8 veces más rápido que exifr, y 120 0 veces más que el de mini_exiftool.

referencia:

require 'benchmark' 
require 'mini_exiftool' 
require 'exifr' 
require 'exif' 

N = 50 
FILE_PATH = File.expand_path('../../spec/sample.jpg', __FILE__) 
Benchmark.bmbm do |x| 
    x.report 'mini_exiftool' do 
    N.times{ MiniExiftool.new(FILE_PATH).image_width } 
    end 
    x.report 'exifr' do 
    N.times{ EXIFR::JPEG.new(FILE_PATH).width } 
    end 
    x.report 'exif' do 
    N.times{ Exif::Data.new(FILE_PATH).image_width } 
    end 
end 

de salida:

Rehearsal ------------------------------------------------- 
mini_exiftool 0.150000 0.050000 12.390000 (12.546417) 
exifr   0.090000 0.000000 0.090000 ( 0.091090) 
exif   0.010000 0.000000 0.010000 ( 0.010343) 
--------------------------------------- total: 12.490000sec 
        user  system  total  real 
mini_exiftool 0.150000 0.050000 12.400000 (12.540122) 
exifr   0.080000 0.000000 0.080000 ( 0.083251) 
exif   0.010000 0.000000 0.010000 ( 0.009855) 

mini_exiftool es un poco excesivo para recuperar únicamente los datos. Entonces, en tu caso, creo que deberías usar exifr en JRuby, o probar exif en MRI.

+0

Excelente trabajo al incluir puntos de referencia. También debe incluir qué comandos se ejecutaron para generar estos puntos de referencia, de lo contrario, es imposible de validar. ;) –

+1

@JoshPinter Ahora está incluido. Gracias por tu recordatorio. = D –

+0

Buen trabajo. ¡Gracias! –

Cuestiones relacionadas