exifr 1.1.3 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +5 -0
- data/README.rdoc +23 -1
- data/Rakefile +19 -22
- data/bin/exifr +2 -0
- data/lib/exifr.rb +6 -1
- data/lib/exifr/jpeg.rb +1 -1
- data/lib/exifr/tiff.rb +35 -9
- data/tests/jpeg_test.rb +20 -22
- data/tests/test_helper.rb +20 -3
- data/tests/tiff_test.rb +35 -29
- metadata +21 -22
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e8d2d002f8e0ff77575cdc359ba0133af33174c1
|
4
|
+
data.tar.gz: 4ea1a55bbdc7480a638e1b5f43cad3be37c019c3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9a777bb39ad994fe6cdb54598498e8299c620a4e7c0d912945ee9940ba66a3febe11c10b39c28118fc1267a61c888a392fd1e22d929d8de220d734e3df20964a
|
7
|
+
data.tar.gz: 9507b789bb62957afe07ec16e1c972e29fa70fce55d026e6b1fefab07fd6ba285e0b87815cbb1d91692a8255942f11f29e1fe06839b10d18fe589e2a5a19f982
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
EXIF Reader 1.2.0
|
2
|
+
* enhancement; "log warnings when EXIF data is malformed"
|
3
|
+
* enhancement; "allow alternative Time adapter"
|
4
|
+
* enhancement; "[GH#33] add reader for orientation type"; thanks Damir Svrtan
|
5
|
+
|
1
6
|
EXIF Reader 1.1.3
|
2
7
|
* bug fix; "[GH#27] some error when :shutter_speed_value is too big"; thanks to zamia
|
3
8
|
|
data/README.rdoc
CHANGED
@@ -20,6 +20,28 @@ EXIF Reader is a module to read metadata from JPEG and TIFF images.
|
|
20
20
|
EXIFR::JPEG.new('enkhuizen.jpg').gps.latitude # => 52.7197888888889
|
21
21
|
EXIFR::JPEG.new('enkhuizen.jpg').gps.longitude # => 5.28397777777778
|
22
22
|
|
23
|
+
== Logging warnings
|
24
|
+
When EXIF information is malformed, a warning is logged to STDERR with
|
25
|
+
the standard Ruby logger. Log to some other location by supplying an
|
26
|
+
alternative implementation:
|
27
|
+
|
28
|
+
EXIFR.logger = SyslogLogger.new
|
29
|
+
|
30
|
+
== Time zone support
|
31
|
+
EXIF does not support time zones so this code does not support time
|
32
|
+
zones. All time stamps are created in the local time zone with:
|
33
|
+
|
34
|
+
Time.local(..)
|
35
|
+
|
36
|
+
It is possible to change this behavior by supplying an alternative
|
37
|
+
implementation. For those who prefer UTC:
|
38
|
+
|
39
|
+
EXIFR::TIFF.mktime_proc = proc{|*args| Time.utc(*args)}
|
40
|
+
|
41
|
+
Or when the application depends on ActiveSupport for time zone handling:
|
42
|
+
|
43
|
+
EXIFR::TIFF.mktime_proc = proc{|*args| Time.zone.local(*args)}
|
44
|
+
|
23
45
|
== XMP data access
|
24
46
|
If you need to access XMP data you can use the xmp gem. More info and
|
25
47
|
examples at https://github.com/amberbit/xmp
|
@@ -28,4 +50,4 @@ examples at https://github.com/amberbit/xmp
|
|
28
50
|
R.W. van 't Veer
|
29
51
|
|
30
52
|
== Copyright
|
31
|
-
Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
|
53
|
+
Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
|
data/Rakefile
CHANGED
@@ -1,39 +1,36 @@
|
|
1
|
-
# Copyright (c) 2006
|
1
|
+
# Copyright (c) 2006-2013 - R.W. van 't Veer
|
2
2
|
|
3
|
-
require 'rake/rdoctask'
|
4
3
|
require 'rake/testtask'
|
5
4
|
|
6
5
|
task :default => :test
|
7
6
|
|
8
|
-
desc 'Generate site'
|
9
|
-
task :site => :rdoc do
|
10
|
-
system 'rsync -av --delete doc/ remvee@rubyforge.org:/var/www/gforge-projects/exifr'
|
11
|
-
end
|
12
|
-
|
13
|
-
Rake::RDocTask.new do |rd|
|
14
|
-
rd.title = 'EXIF Reader for Ruby API Documentation'
|
15
|
-
rd.main = "README.rdoc"
|
16
|
-
rd.rdoc_dir = "doc/api"
|
17
|
-
rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
7
|
Rake::TestTask.new do |t|
|
22
8
|
t.libs << 'lib' << 'tests'
|
23
9
|
t.test_files = FileList['tests/*_test.rb']
|
24
10
|
end
|
25
11
|
|
26
12
|
begin
|
27
|
-
|
13
|
+
begin
|
14
|
+
require 'rdoc/task'
|
15
|
+
rescue LoadError
|
16
|
+
require 'rake/rdoctask'
|
17
|
+
end
|
28
18
|
|
29
|
-
|
30
|
-
|
31
|
-
|
19
|
+
desc 'Generate site'
|
20
|
+
task :site => :rdoc do
|
21
|
+
system 'rsync -av --delete doc/ remvee@rubyforge.org:/var/www/gforge-projects/exifr'
|
22
|
+
end
|
23
|
+
|
24
|
+
Rake::RDocTask.new do |rd|
|
25
|
+
rd.title = 'EXIF Reader for Ruby API Documentation'
|
26
|
+
rd.main = "README.rdoc"
|
27
|
+
rd.rdoc_dir = "doc/api"
|
28
|
+
rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
|
32
29
|
end
|
33
30
|
|
34
|
-
desc 'Remove all artifacts left by testing and packaging'
|
35
|
-
task :clean => [:clobber_rdoc, :clobber_rcov]
|
36
|
-
rescue LoadError
|
37
31
|
desc 'Remove all artifacts left by testing and packaging'
|
38
32
|
task :clean => [:clobber_rdoc]
|
33
|
+
|
34
|
+
rescue StandardError
|
35
|
+
nil
|
39
36
|
end
|
data/bin/exifr
CHANGED
data/lib/exifr.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
|
1
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
|
2
|
+
|
3
|
+
require 'logger'
|
2
4
|
|
3
5
|
module EXIFR
|
4
6
|
class MalformedImage < StandardError; end
|
5
7
|
class MalformedJPEG < MalformedImage; end
|
6
8
|
class MalformedTIFF < MalformedImage; end
|
9
|
+
|
10
|
+
class << self; attr_accessor :logger; end
|
11
|
+
self.logger = Logger.new(STDERR)
|
7
12
|
end
|
8
13
|
|
9
14
|
require 'exifr/jpeg'
|
data/lib/exifr/jpeg.rb
CHANGED
data/lib/exifr/tiff.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
|
1
|
+
# Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
|
2
2
|
|
3
3
|
require 'exifr'
|
4
4
|
require 'rational'
|
@@ -238,10 +238,21 @@ module EXIFR
|
|
238
238
|
})
|
239
239
|
IFD_TAGS = [:image, :exif, :gps] # :nodoc:
|
240
240
|
|
241
|
+
class << self
|
242
|
+
# Callable to create a +Time+ object. Defaults to <tt>proc{|*a|Time.local(*a)}</tt>.
|
243
|
+
attr_accessor :mktime_proc
|
244
|
+
end
|
245
|
+
self.mktime_proc = proc { |*args| Time.local(*args) }
|
246
|
+
|
241
247
|
time_proc = proc do |value|
|
242
248
|
value.map do |value|
|
243
249
|
if value =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/
|
244
|
-
|
250
|
+
begin
|
251
|
+
mktime_proc.call($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i)
|
252
|
+
rescue => ex
|
253
|
+
EXIFR.logger.warn("Bad date/time value #{value.inspect}: #{ex}")
|
254
|
+
nil
|
255
|
+
end
|
245
256
|
else
|
246
257
|
value
|
247
258
|
end
|
@@ -259,6 +270,11 @@ module EXIFR
|
|
259
270
|
@value
|
260
271
|
end
|
261
272
|
|
273
|
+
# Symbolic value.
|
274
|
+
def to_sym
|
275
|
+
@type
|
276
|
+
end
|
277
|
+
|
262
278
|
# Debugging output.
|
263
279
|
def inspect
|
264
280
|
"\#<EXIFR::TIFF::Orientation:#{@type}(#{@value})>"
|
@@ -300,9 +316,18 @@ module EXIFR
|
|
300
316
|
const_set("#{type}Orientation", ORIENTATIONS[index] = Orientation.new(index, type))
|
301
317
|
end
|
302
318
|
|
319
|
+
degrees_proc = proc do |v|
|
320
|
+
begin
|
321
|
+
Degrees.new(v)
|
322
|
+
rescue => ex
|
323
|
+
EXIFR.logger.warn("malformed GPS degrees: #{ex}")
|
324
|
+
nil
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
303
328
|
class Degrees < Array
|
304
329
|
def initialize(arr)
|
305
|
-
raise
|
330
|
+
raise "expected [degrees, minutes, seconds]" unless arr.length == 3
|
306
331
|
super
|
307
332
|
end
|
308
333
|
|
@@ -326,10 +351,10 @@ module EXIFR
|
|
326
351
|
:date_time_digitized => time_proc,
|
327
352
|
:date_time => time_proc,
|
328
353
|
:orientation => proc { |v| v.map{|v| ORIENTATIONS[v]} },
|
329
|
-
:gps_latitude =>
|
330
|
-
:gps_longitude =>
|
331
|
-
:gps_dest_latitude =>
|
332
|
-
:gps_dest_longitude =>
|
354
|
+
:gps_latitude => degrees_proc,
|
355
|
+
:gps_longitude => degrees_proc,
|
356
|
+
:gps_dest_latitude => degrees_proc,
|
357
|
+
:gps_dest_longitude => degrees_proc,
|
333
358
|
:shutter_speed_value => proc { |v| v.map { |v| v.abs < 100 ? rational(1, (2 ** v).to_i) : nil } },
|
334
359
|
:aperture_value => proc { |v| v.map { |v| round(1.4142 ** v, 1) } }
|
335
360
|
})
|
@@ -337,7 +362,7 @@ module EXIFR
|
|
337
362
|
# Names for all recognized TIFF fields.
|
338
363
|
TAGS = ([TAG_MAPPING.keys, TAG_MAPPING.values.map{|v|v.values}].flatten.uniq - IFD_TAGS).map{|v|v.to_s}
|
339
364
|
|
340
|
-
# +file+ is a filename or an IO object. Hint: use StringIO when working with slurped data like blobs.
|
365
|
+
# +file+ is a filename or an +IO+ object. Hint: use +StringIO+ when working with slurped data like blobs.
|
341
366
|
def initialize(file)
|
342
367
|
Data.open(file) do |data|
|
343
368
|
@ifds = [IFD.new(data)]
|
@@ -440,7 +465,8 @@ module EXIFR
|
|
440
465
|
end
|
441
466
|
|
442
467
|
@offset_next = @data.readlong(pos)
|
443
|
-
rescue
|
468
|
+
rescue => ex
|
469
|
+
EXIFR.logger.warn("Badly formed IFD: #{ex}")
|
444
470
|
@offset_next = 0
|
445
471
|
end
|
446
472
|
|
data/tests/jpeg_test.rb
CHANGED
@@ -1,27 +1,23 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
|
3
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
|
4
4
|
|
5
5
|
require 'test_helper'
|
6
6
|
|
7
|
-
class JPEGTest <
|
7
|
+
class JPEGTest < TestCase
|
8
8
|
def test_initialize
|
9
9
|
all_test_jpegs.each do |fname|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
assert_nothing_raised do
|
14
|
-
open(fname) { |rd| JPEG.new(rd) }
|
15
|
-
end
|
16
|
-
assert_nothing_raised do
|
17
|
-
JPEG.new(StringIO.new(File.read(fname)))
|
18
|
-
end
|
10
|
+
assert JPEG.new(fname)
|
11
|
+
open(fname) { |rd| assert JPEG.new(rd) }
|
12
|
+
assert JPEG.new(StringIO.new(File.read(fname)))
|
19
13
|
end
|
20
14
|
end
|
21
15
|
|
22
16
|
def test_raises_malformed_jpeg
|
23
|
-
|
17
|
+
begin
|
24
18
|
JPEG.new(StringIO.new("djibberish"))
|
19
|
+
rescue MalformedJPEG => ex
|
20
|
+
assert ex
|
25
21
|
end
|
26
22
|
end
|
27
23
|
|
@@ -64,8 +60,8 @@ class JPEGTest < Test::Unit::TestCase
|
|
64
60
|
def test_exif
|
65
61
|
assert ! JPEG.new(f('image.jpg')).exif?
|
66
62
|
assert JPEG.new(f('exif.jpg')).exif?
|
67
|
-
|
68
|
-
|
63
|
+
assert JPEG.new(f('exif.jpg')).exif.date_time
|
64
|
+
assert JPEG.new(f('exif.jpg')).exif.f_number
|
69
65
|
end
|
70
66
|
|
71
67
|
def test_to_hash
|
@@ -87,16 +83,21 @@ class JPEGTest < Test::Unit::TestCase
|
|
87
83
|
assert j.methods.include?('date_time')
|
88
84
|
assert j.respond_to?(:date_time)
|
89
85
|
assert j.respond_to?('date_time')
|
90
|
-
|
86
|
+
assert j.date_time
|
91
87
|
assert_kind_of Time, j.date_time
|
92
88
|
|
93
|
-
|
89
|
+
assert j.f_number
|
94
90
|
assert_kind_of Rational, j.f_number
|
95
91
|
end
|
96
92
|
|
97
93
|
def test_no_method_error
|
98
|
-
|
99
|
-
|
94
|
+
JPEG.new(f('image.jpg')).f_number
|
95
|
+
|
96
|
+
begin
|
97
|
+
JPEG.new(f('image.jpg')).foo
|
98
|
+
rescue NoMethodError => ex
|
99
|
+
assert ex
|
100
|
+
end
|
100
101
|
end
|
101
102
|
|
102
103
|
def test_multiple_app1
|
@@ -108,14 +109,11 @@ class JPEGTest < Test::Unit::TestCase
|
|
108
109
|
all_test_jpegs.each do |fname|
|
109
110
|
jpeg = JPEG.new(fname)
|
110
111
|
unless jpeg.thumbnail.nil?
|
111
|
-
|
112
|
-
JPEG.new(StringIO.new(jpeg.thumbnail))
|
113
|
-
end
|
112
|
+
assert JPEG.new(StringIO.new(jpeg.thumbnail))
|
114
113
|
count += 1
|
115
114
|
end
|
116
115
|
end
|
117
116
|
|
118
117
|
assert count > 0, 'no thumbnails found'
|
119
118
|
end
|
120
|
-
|
121
119
|
end
|
data/tests/test_helper.rb
CHANGED
@@ -1,21 +1,38 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
|
3
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
|
4
4
|
|
5
|
-
require 'test/unit'
|
6
5
|
require 'stringio'
|
7
6
|
require 'pp'
|
8
7
|
|
8
|
+
TestCase = begin
|
9
|
+
tc = begin
|
10
|
+
gem 'minitest' rescue nil
|
11
|
+
require 'minitest/autorun'
|
12
|
+
case
|
13
|
+
when defined?(Minitest::Test) ; Minitest::Test
|
14
|
+
when defined?(Minitest::Unit::TestCase) ; Minitest::Unit::TestCase
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
# nop
|
18
|
+
end
|
19
|
+
unless tc
|
20
|
+
require "test/unit"
|
21
|
+
tc = Test::Unit::TestCase
|
22
|
+
end
|
23
|
+
tc
|
24
|
+
end
|
25
|
+
|
9
26
|
$:.unshift("#{File.dirname(__FILE__)}/../lib")
|
10
27
|
require 'exifr'
|
11
28
|
include EXIFR
|
12
29
|
|
30
|
+
EXIFR.logger = Logger.new(StringIO.new)
|
13
31
|
|
14
32
|
def all_test_jpegs
|
15
33
|
Dir[f('*.jpg')]
|
16
34
|
end
|
17
35
|
|
18
|
-
|
19
36
|
def all_test_exifs
|
20
37
|
Dir[f('*.exif')]
|
21
38
|
end
|
data/tests/tiff_test.rb
CHANGED
@@ -1,31 +1,27 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011 - R.W. van 't Veer
|
3
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 - R.W. van 't Veer
|
4
4
|
|
5
5
|
require 'test_helper'
|
6
6
|
|
7
|
-
class TIFFTest <
|
7
|
+
class TIFFTest < TestCase
|
8
8
|
def setup
|
9
9
|
@t = TIFF.new(f('nikon_d1x.tif'))
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_initialize
|
13
13
|
all_test_tiffs.each do |fname|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
assert_nothing_raised do
|
18
|
-
open(fname) { |rd| TIFF.new(rd) }
|
19
|
-
end
|
20
|
-
assert_nothing_raised do
|
21
|
-
TIFF.new(StringIO.new(File.read(fname)))
|
22
|
-
end
|
14
|
+
assert TIFF.new(fname)
|
15
|
+
open(fname) { |rd| assert TIFF.new(rd) }
|
16
|
+
assert TIFF.new(StringIO.new(File.read(fname)))
|
23
17
|
end
|
24
18
|
end
|
25
19
|
|
26
20
|
def test_raises_malformed_tiff
|
27
|
-
|
21
|
+
begin
|
28
22
|
TIFF.new(StringIO.new("djibberish"))
|
23
|
+
rescue MalformedTIFF => ex
|
24
|
+
assert ex
|
29
25
|
end
|
30
26
|
end
|
31
27
|
|
@@ -65,6 +61,14 @@ class TIFFTest < Test::Unit::TestCase
|
|
65
61
|
assert_nil TIFF.new(f('weird_date.exif')).date_time
|
66
62
|
end
|
67
63
|
|
64
|
+
def test_time_with_zone
|
65
|
+
old_proc = TIFF.mktime_proc
|
66
|
+
TIFF.mktime_proc = proc { |*args| "TIME-WITH-ZONE" }
|
67
|
+
assert_equal "TIME-WITH-ZONE", TIFF.new(f('nikon_d1x.tif')).date_time
|
68
|
+
ensure
|
69
|
+
TIFF.mktime_proc = old_proc
|
70
|
+
end
|
71
|
+
|
68
72
|
def test_orientation
|
69
73
|
tested = 0 # count tests because not all exif samples have an orientation field
|
70
74
|
all_test_exifs.each do |fname|
|
@@ -80,6 +84,16 @@ class TIFFTest < Test::Unit::TestCase
|
|
80
84
|
TIFF::RightBottomOrientation,
|
81
85
|
TIFF::LeftBottomOrientation
|
82
86
|
].any? { |c| orientation == c }, 'not an orientation'
|
87
|
+
assert [
|
88
|
+
:TopLeft,
|
89
|
+
:TopRight,
|
90
|
+
:BottomRight,
|
91
|
+
:BottomLeft,
|
92
|
+
:LeftTop,
|
93
|
+
:RightTop,
|
94
|
+
:RightBottom,
|
95
|
+
:LeftBottom
|
96
|
+
].any? { |c| orientation.to_sym == c }, 'not an orientation symbol'
|
83
97
|
assert orientation.respond_to?(:to_i)
|
84
98
|
assert orientation.respond_to?(:transform_rmagick)
|
85
99
|
tested += 1
|
@@ -110,18 +124,16 @@ class TIFFTest < Test::Unit::TestCase
|
|
110
124
|
assert @t.methods.include?('f_number')
|
111
125
|
assert TIFF.instance_methods.include?('f_number')
|
112
126
|
|
113
|
-
|
127
|
+
assert @t.f_number
|
114
128
|
assert_kind_of Rational, @t.f_number
|
115
|
-
|
129
|
+
assert @t[0].f_number
|
116
130
|
assert_kind_of Rational, @t[0].f_number
|
117
131
|
end
|
118
132
|
|
119
133
|
def test_avoid_dispatch_to_nonexistent_ifds
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
TIFF::TAGS.each { |tag| t.send(tag) }
|
124
|
-
end
|
134
|
+
all_test_tiffs.each do |fname|
|
135
|
+
assert t = TIFF.new(fname)
|
136
|
+
assert TIFF::TAGS.map { |tag| t.send(tag) }
|
125
137
|
end
|
126
138
|
end
|
127
139
|
|
@@ -135,9 +147,7 @@ class TIFFTest < Test::Unit::TestCase
|
|
135
147
|
end
|
136
148
|
|
137
149
|
def test_old_style
|
138
|
-
|
139
|
-
assert_not_nil @t[:f_number]
|
140
|
-
end
|
150
|
+
assert @t[:f_number]
|
141
151
|
end
|
142
152
|
|
143
153
|
def test_yaml_dump_and_load
|
@@ -155,10 +165,8 @@ class TIFFTest < Test::Unit::TestCase
|
|
155
165
|
all_test_tiffs.each do |fname|
|
156
166
|
t = TIFF.new(fname)
|
157
167
|
unless t.jpeg_thumbnails.empty?
|
158
|
-
|
159
|
-
|
160
|
-
JPEG.new(StringIO.new(n))
|
161
|
-
end
|
168
|
+
t.jpeg_thumbnails.each do |n|
|
169
|
+
assert JPEG.new(StringIO.new(n))
|
162
170
|
end
|
163
171
|
count += 1
|
164
172
|
end
|
@@ -176,9 +184,7 @@ class TIFFTest < Test::Unit::TestCase
|
|
176
184
|
end
|
177
185
|
|
178
186
|
def test_handle_out_of_range_offset
|
179
|
-
|
180
|
-
assert 'NIKON', TIFF.new(f('out-of-range.exif')).make
|
181
|
-
end
|
187
|
+
assert_equal 'NIKON', TIFF.new(f('out-of-range.exif')).make
|
182
188
|
end
|
183
189
|
|
184
190
|
def test_negative_exposure_bias_value
|
metadata
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exifr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- R.W. van 't Veer
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-09-30 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
|
-
description:
|
13
|
+
description: EXIF Reader is a module to read EXIF from JPEG and TIFF images.
|
15
14
|
email: remco@remvee.net
|
16
15
|
executables:
|
17
16
|
- exifr
|
@@ -20,62 +19,62 @@ extra_rdoc_files:
|
|
20
19
|
- README.rdoc
|
21
20
|
- CHANGELOG
|
22
21
|
files:
|
22
|
+
- CHANGELOG
|
23
|
+
- README.rdoc
|
23
24
|
- Rakefile
|
24
25
|
- bin/exifr
|
25
26
|
- lib/exifr.rb
|
26
27
|
- lib/exifr/jpeg.rb
|
27
28
|
- lib/exifr/tiff.rb
|
28
29
|
- tests/data/1x1.jpg
|
29
|
-
- tests/data/apple-aperture-1.5.exif
|
30
|
-
- tests/data/canon-g3.exif
|
31
30
|
- tests/data/Canon_PowerShot_A85.exif
|
32
31
|
- tests/data/Casio-EX-S20.exif
|
32
|
+
- tests/data/FUJIFILM-FinePix_S3000.exif
|
33
|
+
- tests/data/Panasonic-DMC-LC33.exif
|
34
|
+
- tests/data/Trust-DC3500_MINI.exif
|
35
|
+
- tests/data/apple-aperture-1.5.exif
|
36
|
+
- tests/data/bad-shutter_speed_value.exif
|
37
|
+
- tests/data/canon-g3.exif
|
33
38
|
- tests/data/endless-loop.exif
|
34
39
|
- tests/data/exif.jpg
|
35
|
-
- tests/data/FUJIFILM-FinePix_S3000.exif
|
36
40
|
- tests/data/gps.exif
|
37
41
|
- tests/data/image.jpg
|
38
42
|
- tests/data/multiple-app1.jpg
|
39
43
|
- tests/data/negative-exposure-bias-value.exif
|
40
44
|
- tests/data/nikon_d1x.tif
|
41
45
|
- tests/data/out-of-range.exif
|
42
|
-
- tests/data/Panasonic-DMC-LC33.exif
|
43
46
|
- tests/data/plain.tif
|
44
|
-
- tests/data/Trust-DC3500_MINI.exif
|
45
47
|
- tests/data/user-comment.exif
|
46
48
|
- tests/data/weird_date.exif
|
47
|
-
- tests/data/bad-shutter_speed_value.exif
|
48
49
|
- tests/jpeg_test.rb
|
49
50
|
- tests/test_helper.rb
|
50
51
|
- tests/tiff_test.rb
|
51
|
-
- README.rdoc
|
52
|
-
- CHANGELOG
|
53
52
|
homepage: http://github.com/remvee/exifr/
|
54
|
-
licenses:
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
55
56
|
post_install_message:
|
56
57
|
rdoc_options:
|
57
|
-
- --title
|
58
|
+
- "--title"
|
58
59
|
- EXIF Reader for Ruby API Documentation
|
59
|
-
- --main
|
60
|
+
- "--main"
|
60
61
|
- README.rdoc
|
61
62
|
require_paths:
|
62
63
|
- lib
|
63
64
|
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
-
none: false
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
70
|
requirements:
|
72
|
-
- -
|
71
|
+
- - ">="
|
73
72
|
- !ruby/object:Gem::Version
|
74
73
|
version: '0'
|
75
74
|
requirements: []
|
76
75
|
rubyforge_project:
|
77
|
-
rubygems_version:
|
76
|
+
rubygems_version: 2.2.2
|
78
77
|
signing_key:
|
79
|
-
specification_version:
|
80
|
-
summary:
|
78
|
+
specification_version: 4
|
79
|
+
summary: Read EXIF from JPEG and TIFF images
|
81
80
|
test_files: []
|