exifr 0.10.2 → 0.10.3
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.
- data/CHANGELOG +4 -1
- data/Rakefile +1 -1
- data/lib/jpeg.rb +1 -1
- data/lib/tiff.rb +54 -28
- data/tests/test_tiff.rb +20 -1
- metadata +3 -3
data/CHANGELOG
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
EXIF Reader 0.10.3
|
2
|
+
* YAML friendly; can now safely (de)serialize
|
3
|
+
|
1
4
|
EXIF Reader 0.10.2
|
2
|
-
* bug fix (thanks to Alexander Staubo for providing me
|
5
|
+
* bug fix (thanks to Alexander Staubo for providing me with sample data);
|
3
6
|
don't fail on out-of-range IFD offsets for Apple Aperture generated JPGs
|
4
7
|
|
5
8
|
EXIF Reader 0.10.1
|
data/Rakefile
CHANGED
data/lib/jpeg.rb
CHANGED
@@ -35,7 +35,7 @@ module EXIFR
|
|
35
35
|
!exif.nil?
|
36
36
|
end
|
37
37
|
|
38
|
-
#
|
38
|
+
# Dispatch to EXIF. When no EXIF data is available but the +method+ does exist
|
39
39
|
# for EXIF data +nil+ will be returned.
|
40
40
|
def method_missing(method, *args)
|
41
41
|
super unless args.empty?
|
data/lib/tiff.rb
CHANGED
@@ -12,7 +12,7 @@ module EXIFR
|
|
12
12
|
# == Orientation
|
13
13
|
# The property <tt>:orientation</tt> describes the subject rotated and/or
|
14
14
|
# mirrored in relation to the camera. It is translated to one of the following
|
15
|
-
#
|
15
|
+
# instances:
|
16
16
|
# * TopLeftOrientation
|
17
17
|
# * TopRightOrientation
|
18
18
|
# * BottomRightOrientation
|
@@ -22,7 +22,7 @@ module EXIFR
|
|
22
22
|
# * RightBottomOrientation
|
23
23
|
# * LeftBottomOrientation
|
24
24
|
#
|
25
|
-
# These
|
25
|
+
# These instances of Orientation have two methods:
|
26
26
|
# * <tt>to_i</tt>; return the original integer
|
27
27
|
# * <tt>transform_rmagick(image)</tt>; transforms the given RMagick::Image
|
28
28
|
# to a viewable version
|
@@ -33,7 +33,7 @@ module EXIFR
|
|
33
33
|
# EXIFR::TIFF.new('DSC_0218.TIF').model # => "NIKON D1X"
|
34
34
|
# EXIFR::TIFF.new('DSC_0218.TIF').date_time # => Tue May 23 19:15:32 +0200 2006
|
35
35
|
# EXIFR::TIFF.new('DSC_0218.TIF').exposure_time # => Rational(1, 100)
|
36
|
-
# EXIFR::TIFF.new('DSC_0218.TIF').orientation # => EXIFR::TIFF::
|
36
|
+
# EXIFR::TIFF.new('DSC_0218.TIF').orientation # => EXIFR::TIFF::Orientation
|
37
37
|
class TIFF
|
38
38
|
include Enumerable
|
39
39
|
|
@@ -241,28 +241,51 @@ module EXIFR
|
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
244
|
+
# The orientation of the image with respect to the rows and columns.
|
245
|
+
class Orientation
|
246
|
+
def initialize(value, type) # :nodoc:
|
247
|
+
@value, @type = value, type
|
248
|
+
end
|
249
|
+
|
250
|
+
# Field value.
|
251
|
+
def to_i
|
252
|
+
@value
|
253
|
+
end
|
254
|
+
|
255
|
+
# Rotate and/or flip for proper viewing.
|
256
|
+
def transform_rmagick(img)
|
257
|
+
case @type
|
258
|
+
when :TopRight : img.flop
|
259
|
+
when :BottomRight : img.rotate(180)
|
260
|
+
when :BottomLeft : img.flip
|
261
|
+
when :LeftTop : img.rotate(90).flop
|
262
|
+
when :RightTop : img.rotate(90)
|
263
|
+
when :RightBottom : img.rotate(270).flop
|
264
|
+
when :LeftBottom : img.rotate(270)
|
265
|
+
else
|
266
|
+
img
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def ==(other) # :nodoc:
|
271
|
+
Orientation === other && to_i == other.to_i
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
244
275
|
ORIENTATIONS = [] # :nodoc:
|
245
276
|
[
|
246
277
|
nil,
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
].each_with_index do |
|
256
|
-
next unless
|
257
|
-
|
258
|
-
|
259
|
-
eval <<-EOS
|
260
|
-
module #{name}Orientation
|
261
|
-
def self.to_i; #{index}; end
|
262
|
-
def self.transform_rmagick(img); #{rmagic_code}; end
|
263
|
-
end
|
264
|
-
ORIENTATIONS[#{index}] = #{name}Orientation
|
265
|
-
EOS
|
278
|
+
:TopLeft,
|
279
|
+
:TopRight,
|
280
|
+
:BottomRight,
|
281
|
+
:BottomLeft,
|
282
|
+
:LeftTop,
|
283
|
+
:RightTop,
|
284
|
+
:RightBottom,
|
285
|
+
:LeftBottom,
|
286
|
+
].each_with_index do |type,index|
|
287
|
+
next unless type
|
288
|
+
const_set("#{type}Orientation", ORIENTATIONS[index] = Orientation.new(index, type))
|
266
289
|
end
|
267
290
|
|
268
291
|
ADAPTERS = Hash.new { proc { |v| v } } # :nodoc:
|
@@ -278,21 +301,21 @@ module EXIFR
|
|
278
301
|
|
279
302
|
# +file+ is a filename or an IO object.
|
280
303
|
def initialize(file)
|
281
|
-
|
304
|
+
data = file.respond_to?(:read) ? file.read : File.open(file, 'rb') { |io| io.read }
|
282
305
|
|
283
|
-
class <<
|
306
|
+
class << data
|
284
307
|
attr_accessor :short, :long
|
285
308
|
def readshort(pos); self[pos..(pos + 1)].unpack(@short)[0]; end
|
286
309
|
def readlong(pos); self[pos..(pos + 3)].unpack(@long)[0]; end
|
287
310
|
end
|
288
311
|
|
289
|
-
case
|
290
|
-
when 'II';
|
291
|
-
when 'MM';
|
312
|
+
case data[0..1]
|
313
|
+
when 'II'; data.short, data.long = 'v', 'V'
|
314
|
+
when 'MM'; data.short, data.long = 'n', 'N'
|
292
315
|
else; raise 'no II or MM marker found'
|
293
316
|
end
|
294
317
|
|
295
|
-
@ifds = [IFD.new(
|
318
|
+
@ifds = [IFD.new(data)]
|
296
319
|
while ifd = @ifds.last.next; @ifds << ifd; end
|
297
320
|
end
|
298
321
|
|
@@ -384,6 +407,9 @@ module EXIFR
|
|
384
407
|
IFD.new(@data, @offset_next) unless @offset_next == 0 || @offset_next >= @data.size
|
385
408
|
end
|
386
409
|
|
410
|
+
def to_yaml_properties
|
411
|
+
'@fields'
|
412
|
+
end
|
387
413
|
private
|
388
414
|
def add_field(field)
|
389
415
|
return unless tag = TAG_MAPPING[@type][field.tag]
|
data/tests/test_tiff.rb
CHANGED
@@ -64,7 +64,16 @@ class TestTIFF < Test::Unit::TestCase
|
|
64
64
|
all_test_exifs.each do |fname|
|
65
65
|
orientation = TIFF.new(fname).orientation
|
66
66
|
if orientation
|
67
|
-
|
67
|
+
assert [
|
68
|
+
TIFF::TopLeftOrientation,
|
69
|
+
TIFF::TopRightOrientation,
|
70
|
+
TIFF::BottomRightOrientation,
|
71
|
+
TIFF::BottomLeftOrientation,
|
72
|
+
TIFF::LeftTopOrientation,
|
73
|
+
TIFF::RightTopOrientation,
|
74
|
+
TIFF::RightBottomOrientation,
|
75
|
+
TIFF::LeftBottomOrientation
|
76
|
+
].any? { |c| orientation == c }, 'not an orientation'
|
68
77
|
assert orientation.respond_to?(:to_i)
|
69
78
|
assert orientation.respond_to?(:transform_rmagick)
|
70
79
|
tested += 1
|
@@ -117,4 +126,14 @@ class TestTIFF < Test::Unit::TestCase
|
|
117
126
|
assert_not_nil @t[:f_number]
|
118
127
|
end
|
119
128
|
end
|
129
|
+
|
130
|
+
def test_yaml_dump_and_load
|
131
|
+
require 'yaml'
|
132
|
+
|
133
|
+
all_test_tiffs.each do |fname|
|
134
|
+
t = TIFF.new(fname)
|
135
|
+
y = YAML.dump(t)
|
136
|
+
assert_equal t.to_hash, YAML.load(y).to_hash
|
137
|
+
end
|
138
|
+
end
|
120
139
|
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: exifr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.10.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.10.3
|
7
|
+
date: 2007-10-23 00:00:00 +02:00
|
8
8
|
summary: EXIF Reader is a module to read EXIF from JPEG images.
|
9
9
|
require_paths:
|
10
10
|
- lib
|