exifr 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,10 @@
1
+ EXIF Reader 0.9.5
2
+ * patch calls to jpeg through to exif, i.e. jpeg., i.e. jpeg.model == jpeg.exif.model
3
+ * fix exifr commandline utility, needs require 'exifr' now
4
+ * improve test helper
5
+ * reduce size of test images
6
+ * include tests for tinderbox
7
+
1
8
  EXIF Reader 0.9.4
2
9
  * bug fix (thanks to Benjamin Storrier for providing me with sample date);
3
10
  multiple app1 frames will potentially overwrite EXIF tag
@@ -5,6 +12,7 @@ EXIF Reader 0.9.4
5
12
  EXIF Reader 0.9.3
6
13
  * bug fix; "[#4876] Unable to extract gpsinfo"
7
14
  * one-off bug in TiffHeader found and fixed
15
+ * make "InteroperabilityIndex" available
8
16
 
9
17
  EXIF Reader 0.9.2
10
18
  * bug fix; "[#4595] EXIFR::JPEG doesn't support multiple comments", the
@@ -0,0 +1,49 @@
1
+ require 'rake/rdoctask'
2
+ require 'rake/gempackagetask'
3
+ require 'rake/testtask'
4
+ require 'rcov/rcovtask'
5
+
6
+ task :default => :test
7
+
8
+ spec = Gem::Specification.new do |s|
9
+ s.name = 'exifr'
10
+ s.version = '0.9.5'
11
+ s.author = "R.W. van 't Veer"
12
+ s.email = 'remco@remvee.net'
13
+ s.homepage = 'http://exifr.rubyforge.org/'
14
+ s.summary = 'EXIF Reader is a module to read EXIF from JPEG images.'
15
+
16
+ s.autorequire = 'exifr'
17
+ s.files = FileList['Rakefile', '{bin,lib,tests}/**/*'].exclude('rdoc').to_a
18
+
19
+ s.has_rdoc = true
20
+ s.extra_rdoc_files = ['README', 'CHANGELOG']
21
+
22
+ s.bindir = 'bin'
23
+ s.executables = ['exifr']
24
+ end
25
+
26
+ Rake::GemPackageTask.new(spec) do |pkg|
27
+ pkg.need_tar = true
28
+ end
29
+
30
+ Rake::RDocTask.new do |rd|
31
+ rd.title = 'EXIF Reader for Ruby API Documentation'
32
+ rd.main = "README"
33
+ rd.rdoc_dir = "doc/api"
34
+ rd.rdoc_files.include("README", "lib/**/*.rb")
35
+ end
36
+
37
+
38
+ Rake::TestTask.new do |t|
39
+ t.libs << 'lib' << 'tests'
40
+ t.test_files = FileList['tests/test*.rb']
41
+ end
42
+
43
+ Rcov::RcovTask.new do |t|
44
+ t.libs << 'lib' << 'tests'
45
+ t.test_files = FileList['tests/test*.rb']
46
+ end
47
+
48
+ desc 'Remove all artifacts left by testing and packaging'
49
+ task :clean => [:clobber_package, :clobber_rdoc, :clobber_rcov]
data/bin/exifr CHANGED
@@ -1,3 +1,4 @@
1
+ require 'exifr'
1
2
  include EXIFR
2
3
 
3
4
  def pp(fname)
@@ -30,4 +31,4 @@ else
30
31
  pp fname
31
32
  puts
32
33
  end
33
- end
34
+ end
@@ -220,16 +220,13 @@ module EXIFR
220
220
 
221
221
  # +data+ the content of the JPEG APP1 frame without the EXIF marker
222
222
  def initialize(data)
223
- @data = data
224
- traverse(TiffHeader.new(@data))
223
+ traverse(data)
224
+ pull_thumbnail(data)
225
225
  freeze
226
226
  end
227
227
 
228
- # access to thumbnail, if included
229
- def thumbnail
230
- start, length = self[:jpeg_interchange_format], self[:jpeg_interchange_format_length]
231
- @data[start..(start + length)] if start && length
232
- end
228
+ # thumbnail, if included
229
+ attr_reader :thumbnail
233
230
 
234
231
  # convience; <tt>self[method]</tt>
235
232
  def method_missing(method, *args)
@@ -237,17 +234,22 @@ module EXIFR
237
234
  end
238
235
 
239
236
  private
240
- def traverse(tiff, ifd = :exif)
241
- tiff.fields.each do |f|
237
+ def traverse(data, offset = nil, ifd = :exif)
238
+ TiffHeader.new(data, offset).fields.each do |f|
242
239
  tag = TAGS[ifd][f.tag]
243
240
  value = f.value.map { |v| ADAPTERS[tag][v] } if f.value
244
241
  value = (value.kind_of?(Array) && value.size == 1) ? value.first : value
245
242
  if EXIF_HEADERS.include?(tag)
246
- traverse(TiffHeader.new(@data, f.offset), tag)
243
+ traverse(data, f.offset, tag)
247
244
  elsif tag
248
245
  self[tag] = value
249
246
  end
250
247
  end
251
248
  end
249
+
250
+ def pull_thumbnail(data)
251
+ start, length = self[:jpeg_interchange_format], self[:jpeg_interchange_format_length]
252
+ @thumbnail = data[start..(start + length)] if start && length
253
+ end
252
254
  end
253
255
  end
@@ -35,6 +35,15 @@ module EXIFR
35
35
  !exif.nil?
36
36
  end
37
37
 
38
+ # patch through to exif
39
+ def method_missing(method, *args)
40
+ if args.empty?
41
+ exif[method] if exif?
42
+ else
43
+ super
44
+ end
45
+ end
46
+
38
47
  private
39
48
  def examine(io)
40
49
  raise 'malformed JPEG' unless io.getc == 0xFF && io.getc == 0xD8 # SOI
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), 'test_helper')
4
+
5
+ class TestEXIF < Test::Unit::TestCase
6
+ def test_initialize
7
+ [['canon-g3.exif', 'Canon PowerShot G3']].each do |fname,model|
8
+ data = open(f(fname)) { |rd| rd.read }
9
+ assert_equal EXIF.new(data).model, model
10
+ end
11
+
12
+ assert_raise RuntimeError, 'no II or MM marker found' do
13
+ EXIF.new('X' * 100)
14
+ end
15
+ end
16
+
17
+ def test_dates
18
+ all_test_exifs.each do |fname|
19
+ data = open(fname) { |rd| rd.read }
20
+ assert_kind_of Time, EXIF.new(data).date_time
21
+ end
22
+ end
23
+
24
+ def test_orientation
25
+ all_test_exifs.each do |fname|
26
+ data = open(fname) { |rd| rd.read }
27
+ orientation = EXIF.new(data).orientation
28
+ assert_kind_of Module, orientation
29
+ assert orientation.respond_to?(:to_i)
30
+ assert orientation.respond_to?(:transform_rmagick)
31
+ end
32
+ end
33
+
34
+ def test_thumbnail
35
+ assert_not_nil JPEG.new(f('exif.jpg')).exif.thumbnail
36
+
37
+ all_test_exifs.each do |fname|
38
+ data = open(fname) { |rd| rd.read }
39
+ thumbnail = EXIF.new(data).thumbnail
40
+ assert_nothing_raised do
41
+ JPEG.new(StringIO.new(thumbnail))
42
+ end
43
+ end
44
+ end
45
+
46
+ def test_exif_offset
47
+ assert JPEG.new(f('exif.jpg')).exif.include?(:exif_version)
48
+ end
49
+
50
+ def test_gps
51
+ data = open(f('gps.exif')){|rd|rd.read}
52
+ exif = EXIF.new(data)
53
+ assert exif.include?(:gps_version_id)
54
+ assert_equal "\2\2\0\0", exif.gps_version_id
55
+ assert_equal 'N', exif.gps_latitude_ref
56
+ assert_equal 'W', exif.gps_longitude_ref
57
+ assert_equal [5355537.quo(100000), 0.quo(1), 0.quo(1)], exif.gps_latitude
58
+ assert_equal [678886.quo(100000), 0.quo(1), 0.quo(1)], exif.gps_longitude
59
+ assert_equal 'WGS84', exif.gps_map_datum
60
+
61
+ (all_test_exifs - [f('gps.exif')]).each do |fname|
62
+ data = open(fname) { |rd| rd.read }
63
+ assert EXIF.new(data).keys.map{|k|k.to_s}.grep(/gps/).empty?
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'test/unit'
4
+ require 'stringio'
5
+ require 'pp'
6
+
7
+ $:.unshift("#{File.dirname(__FILE__)}/../lib")
8
+ require 'exifr'
9
+ include EXIFR
10
+
11
+
12
+ def all_test_images
13
+ Dir[f('*.jpg')]
14
+ end
15
+
16
+ def all_test_exifs
17
+ Dir[f('*.exif')]
18
+ end
19
+
20
+ def f(fname)
21
+ "#{File.dirname(__FILE__)}/data/#{fname}"
22
+ end
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), 'test_helper')
4
+
5
+ class TestJPEG < Test::Unit::TestCase
6
+ def test_initialize
7
+ all_test_images.each do |fname|
8
+ assert_nothing_raised do
9
+ JPEG.new(fname)
10
+ end
11
+ assert_nothing_raised do
12
+ open(fname) { |rd| JPEG.new(rd) }
13
+ end
14
+ assert_nothing_raised do
15
+ open(fname) { |rd| JPEG.new(StringIO.new(rd.read)) }
16
+ end
17
+ end
18
+ end
19
+
20
+ def test_size
21
+ j = JPEG.new(f('image.jpg'))
22
+ assert_equal j.width, 100
23
+ assert_equal j.height, 75
24
+
25
+ j = JPEG.new(f('exif.jpg'))
26
+ assert_equal j.width, 100
27
+ assert_equal j.height, 75
28
+
29
+ j = JPEG.new(f('1x1.jpg'))
30
+ assert_equal j.width, 1
31
+ assert_equal j.height, 1
32
+ end
33
+
34
+ def test_comment
35
+ assert_equal JPEG.new(f('image.jpg')).comment, "Here's a comment!"
36
+ end
37
+
38
+ def test_exif
39
+ assert ! JPEG.new(f('image.jpg')).exif?
40
+ assert JPEG.new(f('exif.jpg')).exif?
41
+ end
42
+
43
+ def test_multiple_app1
44
+ assert JPEG.new(f('multiple-app1.jpg')).exif?
45
+ end
46
+
47
+ def test_patch_through
48
+ jpeg = JPEG.new(f('exif.jpg'))
49
+ jpeg.exif.each do |k,v|
50
+ assert_equal v, jpeg.send(k)
51
+ end
52
+ end
53
+ end
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.1
3
3
  specification_version: 1
4
4
  name: exifr
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.9.4
7
- date: 2006-08-14 00:00:00 +02:00
6
+ version: 0.9.5
7
+ date: 2007-01-31 00:00:00 +01:00
8
8
  summary: EXIF Reader is a module to read EXIF from JPEG images.
9
9
  require_paths:
10
10
  - lib
@@ -29,11 +29,27 @@ post_install_message:
29
29
  authors:
30
30
  - R.W. van 't Veer
31
31
  files:
32
+ - Rakefile
32
33
  - bin/exifr
33
34
  - lib/exif.rb
34
35
  - lib/exifr.rb
35
36
  - lib/jpeg.rb
36
37
  - lib/tiff_header.rb
38
+ - tests/data
39
+ - tests/test_exif.rb
40
+ - tests/test_helper.rb
41
+ - tests/test_jpeg.rb
42
+ - tests/data/1x1.jpg
43
+ - tests/data/canon-g3.exif
44
+ - tests/data/Canon_PowerShot_A85.exif
45
+ - tests/data/Casio-EX-S20.exif
46
+ - tests/data/exif.jpg
47
+ - tests/data/FUJIFILM-FinePix_S3000.exif
48
+ - tests/data/gps.exif
49
+ - tests/data/image.jpg
50
+ - tests/data/multiple-app1.jpg
51
+ - tests/data/Panasonic-DMC-LC33.exif
52
+ - tests/data/Trust-DC3500_MINI.exif
37
53
  - README
38
54
  - CHANGELOG
39
55
  test_files: []