exifr 1.3.8 → 1.3.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 19c3f1b08e84425d9d0b8a6e6ee11bd2e25190a49ce34d42ea99800f5030fe20
4
- data.tar.gz: 9a834f93b1a02e87bf401b09a033b25fb8b05625b0a60a8795e9ee65e1ea064c
3
+ metadata.gz: 97fa3270a4d14398a02e6bd725753980ae12b74c2f0a6e3c160b840c59c7febf
4
+ data.tar.gz: ec8ed547c94ad6dd83c0a07bb78530408d48637b18edfeb68dcb157a55c5c618
5
5
  SHA512:
6
- metadata.gz: b4fc267041e9090a85eb5ca2a0bfc2fae3d36a72aa45ab716209e6e5e896a775957b65251587e16e7c4e3f0e3c2e491805ce226c68b9b189a8b5bdaf506ebc15
7
- data.tar.gz: f39334aa7142a3b918edf30fa3bd6424ddc50c1906beb2c9d5bf384bc939fba35b410d2ee801410769929a29895e75b223d443af01d7acf7752fbf96adad0fa6
6
+ metadata.gz: 3d10126d25f29634c46c8b5dce11ebd9dbc373c02fc892a74cdb8cbf6aa3cef8086e2a6be2eaac2a65bc83fa64a6f517617e22dc47bc4ea56db631b678a3ee3a
7
+ data.tar.gz: b98ee638dc85ab51c1f86d5b9c34c417047a79d2abb920ee8a13e7decfaf8b66fb484d7d804461de276a3f87fd40f5e30c1a420e3b25e46db51e801f77acc9c3
data/lib/exifr/tiff.rb CHANGED
@@ -331,7 +331,9 @@ module EXIFR
331
331
 
332
332
  class Degrees < Array
333
333
  def initialize(arr)
334
- raise "expected [degrees, minutes, seconds]" unless arr.length == 3
334
+ unless arr.length == 3 && arr.all?{|v| Rational === v}
335
+ raise "expected [degrees, minutes, seconds]; got #{arr.inspect}"
336
+ end
335
337
  super
336
338
  end
337
339
 
@@ -480,10 +482,10 @@ module EXIFR
480
482
  end
481
483
 
482
484
  class IFD # :nodoc:
483
- attr_reader :type, :fields, :offset
485
+ attr_reader :type, :raw_fields, :fields, :offset
484
486
 
485
487
  def initialize(data, offset = nil, type = :image)
486
- @data, @offset, @type, @fields = data, offset, type, {}
488
+ @data, @offset, @type, @raw_fields, @fields = data, offset, type, {}, {}
487
489
 
488
490
  pos = offset || @data.readlong(4)
489
491
  num = @data.readshort(pos)
@@ -544,15 +546,16 @@ module EXIFR
544
546
 
545
547
  private
546
548
  def add_field(field)
547
- return unless tag = TAG_MAPPING[@type][field.tag]
548
- return if @fields[tag]
549
+ return if @raw_fields.include?(field.tag) # first encountered value wins
550
+ @raw_fields[field.tag] = field.value
549
551
 
550
- if IFD_TAGS.include? tag
551
- @fields[tag] = IFD.new(@data, field.offset, tag)
552
- else
553
- value = ADAPTERS[tag][field.value]
554
- @fields[tag] = value.kind_of?(Array) && value.size == 1 ? value.first : value
555
- end
552
+ return unless tag = TAG_MAPPING[@type][field.tag]
553
+ @fields[tag] = if IFD_TAGS.include?(tag)
554
+ IFD.new(@data, field.offset, tag)
555
+ else
556
+ value = ADAPTERS[tag][field.value]
557
+ value.kind_of?(Array) && value.size == 1 ? value.first : value
558
+ end
556
559
  end
557
560
  end
558
561
 
@@ -602,6 +605,10 @@ module EXIFR
602
605
  end
603
606
  rationals
604
607
  end
608
+ when 11 # float
609
+ len, pack = count * 4, proc { |d| d.unpack(data.float + '*') }
610
+ when 12 # double
611
+ len, pack = count * 8, proc { |d| d.unpack(data.double + '*') }
605
612
  else
606
613
  return
607
614
  end
@@ -636,7 +643,7 @@ module EXIFR
636
643
  end
637
644
 
638
645
  class Data #:nodoc:
639
- attr_reader :short, :long, :file
646
+ attr_reader :short, :long, :float, :double, :file
640
647
 
641
648
  def initialize(file)
642
649
  @io = file.respond_to?(:read) ? file : (@file = File.open(file, 'rb'))
@@ -644,8 +651,8 @@ module EXIFR
644
651
  @pos = 0
645
652
 
646
653
  case self[0..1]
647
- when 'II'; @short, @long = 'v', 'V'
648
- when 'MM'; @short, @long = 'n', 'N'
654
+ when 'II'; @short, @long, @float, @double = 'v', 'V', 'e', 'E'
655
+ when 'MM'; @short, @long, @float, @double = 'n', 'N', 'g', 'G'
649
656
  else
650
657
  raise MalformedTIFF, "no byte order information found"
651
658
  end
Binary file
Binary file
data/tests/tiff_test.rb CHANGED
@@ -119,6 +119,10 @@ class TIFFTest < TestCase
119
119
  end
120
120
  end
121
121
 
122
+ def test_bad_gps
123
+ assert_nil TIFF.new(f('bad_gps.exif')).gps
124
+ end
125
+
122
126
  def test_lens_model
123
127
  t = TIFF.new(f('sony-a7ii.exif'))
124
128
  assert_equal('FE 16-35mm F4 ZA OSS', t.lens_model)
@@ -161,7 +165,12 @@ class TIFFTest < TestCase
161
165
  all_test_tiffs.each do |fname|
162
166
  t = TIFF.new(fname)
163
167
  y = YAML.dump(t)
164
- assert_literally_equal t.to_hash, YAML.load(y).to_hash
168
+ v = if YAML.respond_to?(:unsafe_load)
169
+ YAML.unsafe_load(y)
170
+ else
171
+ YAML.load(y)
172
+ end
173
+ assert_literally_equal t.to_hash, v.to_hash
165
174
  end
166
175
  end
167
176
 
@@ -211,4 +220,8 @@ class TIFFTest < TestCase
211
220
  assert t.methods(true).include?(:make)
212
221
  assert ! t.methods(false).include?(:make)
213
222
  end
223
+
224
+ def test_unknow_field
225
+ assert_equal [1, 1, 1, 1], TIFF.new(f('plain.tif')).first.raw_fields[0x0153] # TIFF Tag SampleFormat
226
+ end
214
227
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exifr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.8
4
+ version: 1.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - R.W. van 't Veer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-24 00:00:00.000000000 Z
11
+ date: 2022-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -59,6 +59,7 @@ files:
59
59
  - tests/data/Trust-DC3500_MINI.exif
60
60
  - tests/data/apple-aperture-1.5.exif
61
61
  - tests/data/bad-shutter_speed_value.exif
62
+ - tests/data/bad_gps.exif
62
63
  - tests/data/canon-g3.exif
63
64
  - tests/data/endless-loop.exif
64
65
  - tests/data/exif.jpg
@@ -66,6 +67,7 @@ files:
66
67
  - tests/data/gps-altitude.jpg
67
68
  - tests/data/gps.exif
68
69
  - tests/data/image.jpg
70
+ - tests/data/ios-mspix-milliseconds.jpg
69
71
  - tests/data/multiple-app1.jpg
70
72
  - tests/data/negative-exposure-bias-value.exif
71
73
  - tests/data/nikon_d1x.tif
@@ -73,6 +75,7 @@ files:
73
75
  - tests/data/plain.tif
74
76
  - tests/data/samsung-sc-02b.jpg
75
77
  - tests/data/sony-a7ii.exif
78
+ - tests/data/truncated.exif
76
79
  - tests/data/user-comment.exif
77
80
  - tests/data/weird_date.exif
78
81
  - tests/jpeg_test.rb
@@ -102,8 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
105
  - !ruby/object:Gem::Version
103
106
  version: '0'
104
107
  requirements: []
105
- rubyforge_project:
106
- rubygems_version: 2.7.6
108
+ rubygems_version: 3.3.7
107
109
  signing_key:
108
110
  specification_version: 4
109
111
  summary: Read EXIF from JPEG and TIFF images