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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0d2b292303046e5137f23317c7bf20d53730203a
4
- data.tar.gz: f824911ca1a898a61394221f9172d93a6b7b02a1
2
+ SHA256:
3
+ metadata.gz: 875a312186a0f46c69201e260de535974566c112d4198f91c603c5a57112910d
4
+ data.tar.gz: 5735851e875b2a76f9bb73fb6a4556548fa1ae18ad8d0a0f5ed970648769054c
5
5
  SHA512:
6
- metadata.gz: c3adc6a2475688d765df840b66140e9309c3aa2d94a58a76b466de7794b196cea09cbaaca2379a8de25a2ace95636f8bb82260f1c9047ec9f4732d8cbe6f7ff1
7
- data.tar.gz: 7f4abd34897c876ac7f09a03601c2f901ae54b3b607b7afae572d16a95e9434fcb445a9e5c3ba89b00703121b4ea37e86fe857841f5f6bc99ae25df52a505b34
6
+ metadata.gz: b7b828732884dddb926221ae91ab87e5bee58fdd39a31b26beb1b794db1764661864d2b67844e2ca2e8b5d6b728464005602c927dd0d7fb652f7f57d5a87040c
7
+ data.tar.gz: 828884d3ff08fa3b1855a233fe31868516c31b9cf6f2487dd0db4274e2fb28e643c02b5df3ae0b247033f7cc2afc45e46aef6826ec1ba14fe294a644a9a8f549
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ gemspec
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006-2017 - R.W. van 't Veer
1
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
2
2
 
3
3
  require 'rake/testtask'
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006-2017 - R.W. van 't Veer
1
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
2
2
 
3
3
  require 'logger'
4
4
 
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2006-2017 - R.W. van 't Veer
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
- super + TIFF::TAGS << :gps
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
@@ -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
- data[start..(start + length)]
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
- (super + TAGS + IFD.instance_methods(false)).uniq
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
- gps_altitude && (gps_altitude.to_f * (gps_altitude_ref == "\1" ? -1 : 1)),
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
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006-2017 - R.W. van 't Veer
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
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006-2017 - R.W. van 't Veer
3
+ # Copyright (c) 2006-2020 - R.W. van 't Veer
4
4
 
5
5
  require 'stringio'
6
6
  require 'pp'
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # Copyright (c) 2006-2017 - R.W. van 't Veer
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.2
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: 2017-09-10 00:00:00.000000000 Z
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: remco@remvee.net
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
- - CHANGELOG
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
- post_install_message:
59
- rdoc_options:
60
- - "--title"
61
- - EXIF Reader for Ruby API Documentation
62
- - "--main"
63
- - README.rdoc
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: '0'
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
- rubyforge_project:
78
- rubygems_version: 2.6.11
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
@@ -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