exifr 1.3.2 → 1.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/Gemfile +2 -0
- data/Rakefile +1 -1
- data/lib/exifr.rb +1 -1
- data/lib/exifr/jpeg.rb +7 -3
- data/lib/exifr/tiff.rb +19 -6
- data/tests/data/gps-altitude.jpg +0 -0
- data/tests/data/sony-a7ii.exif +0 -0
- data/tests/jpeg_test.rb +33 -1
- data/tests/test_helper.rb +1 -1
- data/tests/tiff_test.rb +9 -1
- metadata +48 -21
- data/CHANGELOG +0 -145
- data/README.rdoc +0 -57
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 875a312186a0f46c69201e260de535974566c112d4198f91c603c5a57112910d
|
|
4
|
+
data.tar.gz: 5735851e875b2a76f9bb73fb6a4556548fa1ae18ad8d0a0f5ed970648769054c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b7b828732884dddb926221ae91ab87e5bee58fdd39a31b26beb1b794db1764661864d2b67844e2ca2e8b5d6b728464005602c927dd0d7fb652f7f57d5a87040c
|
|
7
|
+
data.tar.gz: 828884d3ff08fa3b1855a233fe31868516c31b9cf6f2487dd0db4274e2fb28e643c02b5df3ae0b247033f7cc2afc45e46aef6826ec1ba14fe294a644a9a8f549
|
data/Gemfile
ADDED
data/Rakefile
CHANGED
data/lib/exifr.rb
CHANGED
data/lib/exifr/jpeg.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2006-
|
|
1
|
+
# Copyright (c) 2006-2020 - R.W. van 't Veer
|
|
2
2
|
|
|
3
3
|
require 'exifr'
|
|
4
4
|
require 'exifr/tiff'
|
|
@@ -66,8 +66,12 @@ module EXIFR
|
|
|
66
66
|
super || methods.include?(method) || (include_all && private_methods.include?(method))
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
def methods # :nodoc:
|
|
70
|
-
|
|
69
|
+
def methods(regular=true) # :nodoc:
|
|
70
|
+
if regular
|
|
71
|
+
super + TIFF::TAGS << :gps
|
|
72
|
+
else
|
|
73
|
+
super
|
|
74
|
+
end
|
|
71
75
|
end
|
|
72
76
|
|
|
73
77
|
class << self
|
data/lib/exifr/tiff.rb
CHANGED
|
@@ -237,6 +237,7 @@ module EXIFR
|
|
|
237
237
|
0x001c => :gps_area_information,
|
|
238
238
|
0x001d => :gps_date_stamp,
|
|
239
239
|
0x001e => :gps_differential,
|
|
240
|
+
0x001f => :gps_h_positioning_error
|
|
240
241
|
},
|
|
241
242
|
})
|
|
242
243
|
IFD_TAGS = [:image, :exif, :gps] # :nodoc:
|
|
@@ -249,9 +250,9 @@ module EXIFR
|
|
|
249
250
|
|
|
250
251
|
time_proc = proc do |value|
|
|
251
252
|
value.map do |v|
|
|
252
|
-
if v =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)
|
|
253
|
+
if v =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)(?:\.(\d{3}))?$/
|
|
253
254
|
begin
|
|
254
|
-
mktime_proc.call($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i)
|
|
255
|
+
mktime_proc.call($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, $7.to_i * 1000)
|
|
255
256
|
rescue => ex
|
|
256
257
|
EXIFR.logger.warn("Bad date/time value #{v.inspect}: #{ex}")
|
|
257
258
|
nil
|
|
@@ -383,7 +384,12 @@ module EXIFR
|
|
|
383
384
|
@jpeg_thumbnails = @ifds.map do |v|
|
|
384
385
|
if v.jpeg_interchange_format && v.jpeg_interchange_format_length
|
|
385
386
|
start, length = v.jpeg_interchange_format, v.jpeg_interchange_format_length
|
|
386
|
-
|
|
387
|
+
if Integer === start && Integer === length
|
|
388
|
+
data[start..(start + length)]
|
|
389
|
+
else
|
|
390
|
+
EXIFR.logger.warn("Non numeric JpegInterchangeFormat data")
|
|
391
|
+
nil
|
|
392
|
+
end
|
|
387
393
|
end
|
|
388
394
|
end.compact
|
|
389
395
|
end
|
|
@@ -423,8 +429,12 @@ module EXIFR
|
|
|
423
429
|
TAGS.include?(method)
|
|
424
430
|
end
|
|
425
431
|
|
|
426
|
-
def methods # :nodoc:
|
|
427
|
-
|
|
432
|
+
def methods(regular=true) # :nodoc:
|
|
433
|
+
if regular
|
|
434
|
+
(super + TAGS + IFD.instance_methods(false)).uniq
|
|
435
|
+
else
|
|
436
|
+
super
|
|
437
|
+
end
|
|
428
438
|
end
|
|
429
439
|
|
|
430
440
|
def encode_with(coder)
|
|
@@ -456,9 +466,12 @@ module EXIFR
|
|
|
456
466
|
# Get GPS location, altitude and image direction return nil when not available.
|
|
457
467
|
def gps
|
|
458
468
|
return nil unless gps_latitude && gps_longitude
|
|
469
|
+
|
|
470
|
+
altitude = gps_altitude.is_a?(Array) ? gps_altitude.first : gps_altitude
|
|
471
|
+
|
|
459
472
|
GPS.new(gps_latitude.to_f * (gps_latitude_ref == 'S' ? -1 : 1),
|
|
460
473
|
gps_longitude.to_f * (gps_longitude_ref == 'W' ? -1 : 1),
|
|
461
|
-
|
|
474
|
+
altitude && (altitude.to_f * (gps_altitude_ref == "\1" ? -1 : 1)),
|
|
462
475
|
gps_img_direction && gps_img_direction.to_f)
|
|
463
476
|
end
|
|
464
477
|
|
|
Binary file
|
|
Binary file
|
data/tests/jpeg_test.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2006-
|
|
3
|
+
# Copyright (c) 2006-2020 - R.W. van 't Veer
|
|
4
4
|
|
|
5
5
|
require 'test_helper'
|
|
6
6
|
|
|
@@ -103,6 +103,13 @@ class JPEGTest < TestCase
|
|
|
103
103
|
end
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
+
def test_methods_method
|
|
107
|
+
j = JPEG.new(f('exif.jpg'))
|
|
108
|
+
assert j.methods.include?(:date_time)
|
|
109
|
+
assert j.methods(true).include?(:date_time)
|
|
110
|
+
assert ! j.methods(false).include?(:date_time)
|
|
111
|
+
end
|
|
112
|
+
|
|
106
113
|
def test_multiple_app1
|
|
107
114
|
assert JPEG.new(f('multiple-app1.jpg')).exif?
|
|
108
115
|
end
|
|
@@ -119,4 +126,29 @@ class JPEGTest < TestCase
|
|
|
119
126
|
|
|
120
127
|
assert count > 0, 'no thumbnails found'
|
|
121
128
|
end
|
|
129
|
+
|
|
130
|
+
def test_gps_with_altitude
|
|
131
|
+
t = JPEG.new(f('gps-altitude.jpg'))
|
|
132
|
+
|
|
133
|
+
assert_equal([Rational(230, 1), Rational(0, 1), Rational(0, 1)], t.gps_altitude)
|
|
134
|
+
assert_equal(230, t.gps.altitude)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_exif_datetime_milliseconds
|
|
138
|
+
if Time.now.strftime('%L') == '%L'
|
|
139
|
+
STDERR.puts("skipping milliseconds test; not supported on this platform")
|
|
140
|
+
return
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
j = JPEG.new(f('exif.jpg'))
|
|
144
|
+
assert_equal('000', j.date_time.strftime('%L'))
|
|
145
|
+
assert_equal('000', j.date_time_original.strftime('%L'))
|
|
146
|
+
assert_equal('000', j.date_time_digitized.strftime('%L'))
|
|
147
|
+
|
|
148
|
+
j = JPEG.new(f('ios-mspix-milliseconds.jpg'))
|
|
149
|
+
assert_equal('978', j.date_time.strftime('%L'))
|
|
150
|
+
assert_equal('978', j.date_time_original.strftime('%L'))
|
|
151
|
+
assert_equal('978', j.date_time_digitized.strftime('%L'))
|
|
152
|
+
end
|
|
153
|
+
|
|
122
154
|
end
|
data/tests/test_helper.rb
CHANGED
data/tests/tiff_test.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2006-
|
|
3
|
+
# Copyright (c) 2006-2020 - R.W. van 't Veer
|
|
4
4
|
|
|
5
5
|
require 'test_helper'
|
|
6
6
|
|
|
@@ -112,6 +112,7 @@ class TIFFTest < TestCase
|
|
|
112
112
|
assert_equal('WGS84', t.gps_map_datum)
|
|
113
113
|
assert_equal(54, t.gps.latitude.round)
|
|
114
114
|
assert_equal(-7, t.gps.longitude.round)
|
|
115
|
+
assert_nil(t.gps.altitude)
|
|
115
116
|
|
|
116
117
|
(all_test_exifs - %w(gps user-comment out-of-range negative-exposure-bias-value).map{|v| f("#{v}.exif")}).each do |fname|
|
|
117
118
|
assert_nil TIFF.new(fname).gps_version_id
|
|
@@ -198,4 +199,11 @@ class TIFFTest < TestCase
|
|
|
198
199
|
def test_nul_terminated_strings
|
|
199
200
|
assert_equal 'GoPro', TIFF.new(f('gopro_hd2.exif')).make
|
|
200
201
|
end
|
|
202
|
+
|
|
203
|
+
def test_methods_method
|
|
204
|
+
t = TIFF.new(f('gopro_hd2.exif'))
|
|
205
|
+
assert t.methods.include?(:make)
|
|
206
|
+
assert t.methods(true).include?(:make)
|
|
207
|
+
assert ! t.methods(false).include?(:make)
|
|
208
|
+
end
|
|
201
209
|
end
|
metadata
CHANGED
|
@@ -1,26 +1,51 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: exifr
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.3.
|
|
4
|
+
version: 1.3.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- R.W. van 't Veer
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
12
|
-
dependencies:
|
|
11
|
+
date: 2020-09-11 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: test-unit
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - '='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 3.1.5
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - '='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 3.1.5
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '12'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '12'
|
|
13
41
|
description: EXIF Reader is a module to read EXIF from JPEG and TIFF images.
|
|
14
|
-
email:
|
|
42
|
+
email: exifr@remworks.net
|
|
15
43
|
executables:
|
|
16
44
|
- exifr
|
|
17
45
|
extensions: []
|
|
18
|
-
extra_rdoc_files:
|
|
19
|
-
- README.rdoc
|
|
20
|
-
- CHANGELOG
|
|
46
|
+
extra_rdoc_files: []
|
|
21
47
|
files:
|
|
22
|
-
-
|
|
23
|
-
- README.rdoc
|
|
48
|
+
- Gemfile
|
|
24
49
|
- Rakefile
|
|
25
50
|
- bin/exifr
|
|
26
51
|
- lib/exifr.rb
|
|
@@ -38,6 +63,7 @@ files:
|
|
|
38
63
|
- tests/data/endless-loop.exif
|
|
39
64
|
- tests/data/exif.jpg
|
|
40
65
|
- tests/data/gopro_hd2.exif
|
|
66
|
+
- tests/data/gps-altitude.jpg
|
|
41
67
|
- tests/data/gps.exif
|
|
42
68
|
- tests/data/image.jpg
|
|
43
69
|
- tests/data/multiple-app1.jpg
|
|
@@ -46,6 +72,7 @@ files:
|
|
|
46
72
|
- tests/data/out-of-range.exif
|
|
47
73
|
- tests/data/plain.tif
|
|
48
74
|
- tests/data/samsung-sc-02b.jpg
|
|
75
|
+
- tests/data/sony-a7ii.exif
|
|
49
76
|
- tests/data/user-comment.exif
|
|
50
77
|
- tests/data/weird_date.exif
|
|
51
78
|
- tests/jpeg_test.rb
|
|
@@ -54,29 +81,29 @@ files:
|
|
|
54
81
|
homepage: http://github.com/remvee/exifr/
|
|
55
82
|
licenses:
|
|
56
83
|
- MIT
|
|
57
|
-
metadata:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
84
|
+
metadata:
|
|
85
|
+
bug_tracker_uri: https://github.com/remvee/exifr/issues
|
|
86
|
+
changelog_uri: https://github.com/remvee/exifr/blob/master/CHANGELOG
|
|
87
|
+
documentation_uri: https://remvee.github.io/exifr/api/
|
|
88
|
+
homepage_uri: https://remvee.github.io/exifr/
|
|
89
|
+
source_code_uri: https://github.com/remvee/exifr
|
|
90
|
+
post_install_message:
|
|
91
|
+
rdoc_options: []
|
|
64
92
|
require_paths:
|
|
65
93
|
- lib
|
|
66
94
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
95
|
requirements:
|
|
68
96
|
- - ">="
|
|
69
97
|
- !ruby/object:Gem::Version
|
|
70
|
-
version:
|
|
98
|
+
version: 1.8.7
|
|
71
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
100
|
requirements:
|
|
73
101
|
- - ">="
|
|
74
102
|
- !ruby/object:Gem::Version
|
|
75
103
|
version: '0'
|
|
76
104
|
requirements: []
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
signing_key:
|
|
105
|
+
rubygems_version: 3.1.4
|
|
106
|
+
signing_key:
|
|
80
107
|
specification_version: 4
|
|
81
108
|
summary: Read EXIF from JPEG and TIFF images
|
|
82
109
|
test_files: []
|
data/CHANGELOG
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
EXIF Reader 1.3.2
|
|
2
|
-
* enhancement; "Add EXIF 2.3 lens information tags"; thanks Clay Gregory
|
|
3
|
-
|
|
4
|
-
EXIF Reader 1.3.1
|
|
5
|
-
* fix executable bin/exifr
|
|
6
|
-
|
|
7
|
-
EXIF Reader 1.3.0
|
|
8
|
-
* workaround warnings when using the ruby "-w" option
|
|
9
|
-
* NOTE: requiring only 'exifr' will nolonger provide EXIFR::JPEG or EXIFR::TIFF, require 'exifr/jpeg' or 'exifr/tiff' instead
|
|
10
|
-
|
|
11
|
-
EXIF Reader 1.2.6
|
|
12
|
-
* bug fix; "[GH#48] handle empty file as malformed jpeg"; thanks Hoàng Xuân Phú
|
|
13
|
-
|
|
14
|
-
EXIF Reader 1.2.5
|
|
15
|
-
* bug fix; "[GH#46] Having stringified methods is not a good idea"; thanks Filipe Costa
|
|
16
|
-
* bug fix; "Fix typo in subsec_time_original key"; thanks Filipe Costa
|
|
17
|
-
|
|
18
|
-
EXIF Reader 1.2.4
|
|
19
|
-
* bug fix; "[GH#43] Fix `respond_to?` signature"; thanks Pete Johns
|
|
20
|
-
|
|
21
|
-
EXIF Reader 1.2.3.1
|
|
22
|
-
* bug fix; "[GH#41] gopro_hd2.exif is not included in the gem"; thanks Peter Wilmott
|
|
23
|
-
|
|
24
|
-
EXIF Reader 1.2.3
|
|
25
|
-
* bug fix; "[GH#40] Handle NUL-terminated ASCII strings"; thanks Malte Rohde
|
|
26
|
-
|
|
27
|
-
EXIF Reader 1.2.2
|
|
28
|
-
* bug fix; "use Reader delegator instead of adding method to File instance"; thanks Ivan Kuchin
|
|
29
|
-
|
|
30
|
-
EXIF Reader 1.2.1
|
|
31
|
-
* bug fix: Value of infinity yields division by zero error
|
|
32
|
-
|
|
33
|
-
EXIF Reader 1.2.0
|
|
34
|
-
* enhancement; "log warnings when EXIF data is malformed"
|
|
35
|
-
* enhancement; "allow alternative Time adapter"
|
|
36
|
-
* enhancement; "[GH#33] add reader for orientation type"; thanks Damir Svrtan
|
|
37
|
-
|
|
38
|
-
EXIF Reader 1.1.3
|
|
39
|
-
* bug fix; "[GH#27] some error when :shutter_speed_value is too big"; thanks to zamia
|
|
40
|
-
|
|
41
|
-
EXIF Reader 1.1.2
|
|
42
|
-
* bug fix; "[GH#25] Incorrect values being extracted for a number of fields"; thanks to Matthew McEachen
|
|
43
|
-
|
|
44
|
-
EXIF Reader 1.1.1
|
|
45
|
-
* feature; "added gps convenience method to make accessing location data easier (degrees to float conversion)"
|
|
46
|
-
* bug fix; "[GH#22] Fix warnings about uninitialized @comment"; thanks to Ryan Greenberg"
|
|
47
|
-
|
|
48
|
-
EXIF Reader 1.0.6
|
|
49
|
-
* bug fix: "[GH#20] `readlong': undefined method `unpack' for nil:NilClass (NoMethodError)"
|
|
50
|
-
|
|
51
|
-
EXIF Reader 1.0.5
|
|
52
|
-
* bug fix: "[GH#19] files opened by TIFF initialize were not being closed"; thanks to Joe Van Overberghe
|
|
53
|
-
|
|
54
|
-
EXIF Reader 1.0.4
|
|
55
|
-
* bug fix: "[GH#17] avoid library search path pollution"
|
|
56
|
-
* enhancement: "[GH#18] add EXIFR::JPEG#app1s method"
|
|
57
|
-
|
|
58
|
-
EXIF Reader 1.0.3
|
|
59
|
-
* enhancement; "raise specific exception to allow better error handling"; thanks to James Miller
|
|
60
|
-
|
|
61
|
-
EXIF Reader 1.0.2
|
|
62
|
-
* bug fix; "[GH#9/12] no block given"; thanks to Ian Leitch
|
|
63
|
-
|
|
64
|
-
EXIF Reader 1.0.1
|
|
65
|
-
* bug fix; "[GH#7] Unable to properly display exposure_bias_value"; thanks to John Krueger
|
|
66
|
-
|
|
67
|
-
EXIF Reader 1.0.0
|
|
68
|
-
* bug fix; "ArgumentError: invalid byte sequence in UTF-8" when reading messy field using Ruby 1.9+
|
|
69
|
-
* enhancement; "[GH#4] more informative inspect for EXIFR::TIFF::Orientation instance"
|
|
70
|
-
* bug fix; "[GH#6] ERROR RuntimeError: can't add a new key into hash during iteration"; thanks to KISHIMOTO, Makoto
|
|
71
|
-
|
|
72
|
-
EXIF Reader 0.10.9
|
|
73
|
-
* bug fix; "[GH#1] user_comment returns nil for jpeg with UserComment"; thanks to Mark Lundquist
|
|
74
|
-
* bug fix; "[GH#2] Nil pointer in tiff.rb"
|
|
75
|
-
* enhancement; "don't read entire files into memory"; thanks to Victor Bogado
|
|
76
|
-
|
|
77
|
-
EXIF Reader 0.10.8
|
|
78
|
-
* feature request; "[#23694] The object interface of JPEG is different from the TIFF one."
|
|
79
|
-
|
|
80
|
-
EXIF Reader 0.10.7
|
|
81
|
-
* bug fix; "[#22403] Wrong file size reported"
|
|
82
|
-
|
|
83
|
-
EXIF Reader 0.10.6.1
|
|
84
|
-
* moved to GitHub
|
|
85
|
-
|
|
86
|
-
EXIF Reader 0.10.6
|
|
87
|
-
* bug fix (thanks to Forian Munz for reporting it); endless loop when reading a malformed EXIF/TIFF
|
|
88
|
-
|
|
89
|
-
EXIF Reader 0.10.5
|
|
90
|
-
* bug fix; "[#15421] duplicate orientation field behavior", first field (of any type) is leading now
|
|
91
|
-
* Ruby 1.9 compatible
|
|
92
|
-
|
|
93
|
-
EXIF Reader 0.10.4
|
|
94
|
-
* Thumbnail extraction; [#15317] Please add thumbnail extraction
|
|
95
|
-
|
|
96
|
-
EXIF Reader 0.10.3
|
|
97
|
-
* YAML friendly; can now safely (de)serialize
|
|
98
|
-
|
|
99
|
-
EXIF Reader 0.10.2
|
|
100
|
-
* bug fix (thanks to Alexander Staubo for providing me with sample data);
|
|
101
|
-
don't fail on out-of-range IFD offsets for Apple Aperture generated JPGs
|
|
102
|
-
|
|
103
|
-
EXIF Reader 0.10.1
|
|
104
|
-
* old style exif access
|
|
105
|
-
|
|
106
|
-
EXIF Reader 0.10
|
|
107
|
-
* TIFF support
|
|
108
|
-
|
|
109
|
-
EXIF Reader 0.9.6
|
|
110
|
-
* bug fix; "[#8458] Conversion from string to Time fails", weird dates will now reflect nil
|
|
111
|
-
|
|
112
|
-
EXIF Reader 0.9.5.1
|
|
113
|
-
* make tinderbox happy by hiding rcov task
|
|
114
|
-
|
|
115
|
-
EXIF Reader 0.9.5
|
|
116
|
-
* patch calls to jpeg through to exif, i.e. jpeg., i.e. jpeg.model == jpeg.exif.model
|
|
117
|
-
* fix exifr commandline utility, needs require 'exifr' now
|
|
118
|
-
* improve test helper
|
|
119
|
-
* reduce size of test images
|
|
120
|
-
* include tests for tinderbox
|
|
121
|
-
|
|
122
|
-
EXIF Reader 0.9.4
|
|
123
|
-
* bug fix (thanks to Benjamin Storrier for providing me with sample date);
|
|
124
|
-
multiple app1 frames will potentially overwrite EXIF tag
|
|
125
|
-
|
|
126
|
-
EXIF Reader 0.9.3
|
|
127
|
-
* bug fix; "[#4876] Unable to extract gpsinfo"
|
|
128
|
-
* one-off bug in TiffHeader found and fixed
|
|
129
|
-
* make "InteroperabilityIndex" available
|
|
130
|
-
|
|
131
|
-
EXIF Reader 0.9.2
|
|
132
|
-
* bug fix; "[#4595] EXIFR::JPEG doesn't support multiple comments", the
|
|
133
|
-
comment property of a JPEG object now contains an array instead of a string
|
|
134
|
-
when multiple COM frames are found
|
|
135
|
-
* EXIF orientation modules including RMagick code to rotate to viewable state
|
|
136
|
-
* access to thumbnail included in EXIF
|
|
137
|
-
* simple commandline utility, "exifr", to view image properties
|
|
138
|
-
* overall code improvements including documentation and tests
|
|
139
|
-
|
|
140
|
-
EXIF Reader 0.9.1
|
|
141
|
-
* bug fix; "4321 Can't create object", division by zero when
|
|
142
|
-
denominator of rational value is zero
|
|
143
|
-
|
|
144
|
-
EXIF Reader 0.9
|
|
145
|
-
* 1st release
|
data/README.rdoc
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
= EXIF Reader
|
|
2
|
-
{<img src="https://badge.fury.io/rb/exifr.svg" alt="Gem Version" />}[https://badge.fury.io/rb/exifr]
|
|
3
|
-
{<img src="https://circleci.com/gh/remvee/exifr/tree/master.svg?style=shield&circle-token=7d957be2d7195f5d07a7c1962926ee626b050c2e" alt="Circle CI" />}[https://circleci.com/gh/remvee/exifr]
|
|
4
|
-
|
|
5
|
-
EXIF Reader is a module to read metadata from JPEG and TIFF images.
|
|
6
|
-
|
|
7
|
-
== Examples
|
|
8
|
-
require 'exifr/jpeg'
|
|
9
|
-
EXIFR::JPEG.new('IMG_6841.JPG').width # => 2272
|
|
10
|
-
EXIFR::JPEG.new('IMG_6841.JPG').height # => 1704
|
|
11
|
-
EXIFR::JPEG.new('IMG_6841.JPG').exif? # => true
|
|
12
|
-
EXIFR::JPEG.new('IMG_6841.JPG').model # => "Canon PowerShot G3"
|
|
13
|
-
EXIFR::JPEG.new('IMG_6841.JPG').date_time # => Fri Feb 09 16:48:54 +0100 2007
|
|
14
|
-
EXIFR::JPEG.new('IMG_6841.JPG').exposure_time.to_s # => "1/15"
|
|
15
|
-
EXIFR::JPEG.new('IMG_6841.JPG').f_number.to_f # => 2.0
|
|
16
|
-
EXIFR::JPEG.new('enkhuizen.jpg').gps.latitude # => 52.7197888888889
|
|
17
|
-
EXIFR::JPEG.new('enkhuizen.jpg').gps.longitude # => 5.28397777777778
|
|
18
|
-
|
|
19
|
-
require 'exifr/tiff'
|
|
20
|
-
EXIFR::TIFF.new('DSC_0218.TIF').width # => 3008
|
|
21
|
-
EXIFR::TIFF.new('DSC_0218.TIF')[1].width # => 160
|
|
22
|
-
EXIFR::TIFF.new('DSC_0218.TIF').model # => "NIKON D1X"
|
|
23
|
-
EXIFR::TIFF.new('DSC_0218.TIF').date_time # => Tue May 23 19:15:32 +0200 2006
|
|
24
|
-
EXIFR::TIFF.new('DSC_0218.TIF').exposure_time.to_s # => "1/100"
|
|
25
|
-
EXIFR::TIFF.new('DSC_0218.TIF').f_number.to_f # => 5.0
|
|
26
|
-
|
|
27
|
-
== Logging warnings
|
|
28
|
-
When EXIF information is malformed, a warning is logged to STDERR with
|
|
29
|
-
the standard Ruby logger. Log to some other location by supplying an
|
|
30
|
-
alternative implementation:
|
|
31
|
-
|
|
32
|
-
EXIFR.logger = SyslogLogger.new
|
|
33
|
-
|
|
34
|
-
== Time zone support
|
|
35
|
-
EXIF does not support time zones so this code does not support time
|
|
36
|
-
zones. All time stamps are created in the local time zone with:
|
|
37
|
-
|
|
38
|
-
Time.local(..)
|
|
39
|
-
|
|
40
|
-
It is possible to change this behavior by supplying an alternative
|
|
41
|
-
implementation. For those who prefer UTC:
|
|
42
|
-
|
|
43
|
-
EXIFR::TIFF.mktime_proc = proc{|*args| Time.utc(*args)}
|
|
44
|
-
|
|
45
|
-
Or when the application depends on ActiveSupport for time zone handling:
|
|
46
|
-
|
|
47
|
-
EXIFR::TIFF.mktime_proc = proc{|*args| Time.zone.local(*args)}
|
|
48
|
-
|
|
49
|
-
== XMP data access
|
|
50
|
-
If you need to access XMP data you can use the xmp gem. More info and
|
|
51
|
-
examples at https://github.com/amberbit/xmp
|
|
52
|
-
|
|
53
|
-
== Author
|
|
54
|
-
R.W. van 't Veer
|
|
55
|
-
|
|
56
|
-
== Copyright
|
|
57
|
-
Copyright (c) 2006-2017 - R.W. van 't Veer
|