如何在Rails中获取图像的EXIF信息

22

我正在使用Rails的paperclip来显示网页中的图片。我想知道如何检索一张图片的EXIF信息(例如尺寸、相机型号、高度、宽度等)。有人能帮助我吗?

谢谢!

4个回答

29

你试过使用exifr gem吗?根据文档

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

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 这是我使用的可行代码。 - Rukmangathan Govindarajan
更新了最终代码的问题。审核通过后将可见。 - Kulbir Saini

11

有3个宝石可以做到这一点:

  1. mini_exiftool:ExifTool命令行封装
  2. exifr:纯Ruby
  3. exif:C扩展(由我编写)

如果您想要编写或编辑EXIF标签,应该选择mini_exiftool,它更强大但非常慢,如下面的基准测试所示,exif比exifr快8倍,比mini_exiftool快1200倍。

基准测试:

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

输出:

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有点过于复杂。因此在您的情况下,我认为您应该使用JRuby中的exifr或在MRI中尝试使用exif。


做得好,包括基准测试。您还应该包括运行生成这些基准测试的命令,否则无法验证。 ;) - Joshua Pinter
1
@JoshPinter 现在已经包含了。谢谢你的提醒。=D - Weihang Jian
干得好。谢谢! - Joshua Pinter
基准测试看起来不错,但是ruby toolbox显示有很多未解决的问题,并且已经三年没有发布新版本了。与其他选项相比,它看起来并不理想。 - JellicleCat

7
您可以尝试使用mini_exiftool gem,它是exiftool命令行工具的包装器。
虽然该gem需要您实际安装命令行工具,但结果是您将获得更加强大的功能。与仅为JPG和TIF文件提供支持的exifr相比,exiftool支持大量的文件格式。它还支持读取和写入exif数据,而exifr仅支持读取。

1
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 

这是我使用的可用代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接