exifparser 1.0.0
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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +1 -0
- data/exifparser.gemspec +23 -0
- data/lib/exifparser.rb +265 -0
- data/lib/exifparser/makernote/canon.rb +502 -0
- data/lib/exifparser/makernote/fujifilm.rb +415 -0
- data/lib/exifparser/makernote/minolta.rb +84 -0
- data/lib/exifparser/makernote/mk_nikonflensname.rb +39 -0
- data/lib/exifparser/makernote/nikon.rb +267 -0
- data/lib/exifparser/makernote/nikon2.rb +581 -0
- data/lib/exifparser/makernote/nikonflensname.rb +438 -0
- data/lib/exifparser/makernote/olympus.rb +225 -0
- data/lib/exifparser/makernote/prove.rb +84 -0
- data/lib/exifparser/makernote/sigma.rb +237 -0
- data/lib/exifparser/pre-setup.rb +1 -0
- data/lib/exifparser/scan.rb +278 -0
- data/lib/exifparser/tag.rb +2298 -0
- data/lib/exifparser/thumbnail.rb +76 -0
- data/lib/exifparser/utils.rb +88 -0
- data/lib/exifparser/version.rb +3 -0
- data/sample/exifview.rb +279 -0
- metadata +96 -0
@@ -0,0 +1,415 @@
|
|
1
|
+
#
|
2
|
+
# exifparser/makernote/fujifilm.rb -
|
3
|
+
#
|
4
|
+
# Copyright (C) 2002 Ryuichi Tamura (r-tam@fsinet.or.jp)
|
5
|
+
#
|
6
|
+
# $Revision: 1.1.1.1 $
|
7
|
+
# $Date: 2002/12/16 07:59:00 $
|
8
|
+
#
|
9
|
+
# Tested against FinePix 6900Z
|
10
|
+
#
|
11
|
+
require 'exifparser/tag'
|
12
|
+
require 'exifparser/utils'
|
13
|
+
|
14
|
+
#
|
15
|
+
#== References
|
16
|
+
#http://www.ba.wakwak.com/%7Etsuruzoh/Computer/Digicams/exif-e.html
|
17
|
+
#
|
18
|
+
|
19
|
+
|
20
|
+
module Exif
|
21
|
+
|
22
|
+
module Tag
|
23
|
+
|
24
|
+
module MakerNote
|
25
|
+
|
26
|
+
#
|
27
|
+
# 0x0000 - Version
|
28
|
+
#
|
29
|
+
class Version < Base
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# 0x1000 - Quality
|
34
|
+
#
|
35
|
+
class Quality < Base
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# 0x1001 - Sharpness
|
40
|
+
#
|
41
|
+
class Sharpness < Base
|
42
|
+
|
43
|
+
def to_s
|
44
|
+
case @formatted
|
45
|
+
when 1,2
|
46
|
+
'Weak'
|
47
|
+
when 3
|
48
|
+
'Standard'
|
49
|
+
when 4
|
50
|
+
'Strong'
|
51
|
+
else
|
52
|
+
'Unknown'
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# 0x1002 - White
|
60
|
+
#
|
61
|
+
class White < Base
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
case @formatted
|
65
|
+
when 0
|
66
|
+
'Auto'
|
67
|
+
when 256
|
68
|
+
'Daylight'
|
69
|
+
when 512
|
70
|
+
'Cloudy'
|
71
|
+
when 768
|
72
|
+
'DaylightColor-fluorescence'
|
73
|
+
when 769
|
74
|
+
'DaywhiteColor-fluorescence'
|
75
|
+
when 770
|
76
|
+
'WhiteColor-fluorescence'
|
77
|
+
when 1024
|
78
|
+
'Incandescence'
|
79
|
+
when 3840
|
80
|
+
'Custom white balance'
|
81
|
+
else
|
82
|
+
'Unknown'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# 0x1003 - Color
|
90
|
+
#
|
91
|
+
class Color < Base
|
92
|
+
|
93
|
+
def to_s
|
94
|
+
case @formatted
|
95
|
+
when 0
|
96
|
+
'Normal(STD)'
|
97
|
+
when 256
|
98
|
+
'High(HARD)'
|
99
|
+
when
|
100
|
+
'Low(ORG)'
|
101
|
+
else
|
102
|
+
'Unknown'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# 0x1004 - Tone
|
110
|
+
#
|
111
|
+
class Tone < Base
|
112
|
+
|
113
|
+
def to_s
|
114
|
+
case @formatted
|
115
|
+
when 0
|
116
|
+
'Normal(STD)'
|
117
|
+
when 256
|
118
|
+
'High(HARD)'
|
119
|
+
when 512
|
120
|
+
'Low(ORG)'
|
121
|
+
else
|
122
|
+
'Unknown'
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# 0x1010 - FlashMode
|
130
|
+
#
|
131
|
+
class FlashMode < Base
|
132
|
+
|
133
|
+
def to_s
|
134
|
+
case @formatted
|
135
|
+
when 0
|
136
|
+
'Auto'
|
137
|
+
when 1
|
138
|
+
'On'
|
139
|
+
when 2
|
140
|
+
'Off'
|
141
|
+
when 3
|
142
|
+
'Red-eye reduction'
|
143
|
+
else
|
144
|
+
'Unknown'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# 0x1011 - FlashStrength
|
152
|
+
#
|
153
|
+
class FlashStrength < Base
|
154
|
+
end
|
155
|
+
|
156
|
+
#
|
157
|
+
# 0x1020 - Macro
|
158
|
+
#
|
159
|
+
class Macro < Base
|
160
|
+
|
161
|
+
def to_s
|
162
|
+
case @formatted
|
163
|
+
when 0
|
164
|
+
'Off'
|
165
|
+
when 1
|
166
|
+
'On'
|
167
|
+
else
|
168
|
+
'Unknown'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
#
|
175
|
+
# 0x1021 - Focus mode
|
176
|
+
#
|
177
|
+
class FocusMode < Base
|
178
|
+
|
179
|
+
def to_s
|
180
|
+
case @formatted
|
181
|
+
when 0
|
182
|
+
'Auto focus'
|
183
|
+
when 1
|
184
|
+
'Manual focus'
|
185
|
+
else
|
186
|
+
'Unknown'
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
#
|
193
|
+
# 0x1030 - SlowSync
|
194
|
+
#
|
195
|
+
class SlowSync < Base
|
196
|
+
|
197
|
+
def to_s
|
198
|
+
case @formatted
|
199
|
+
when 0
|
200
|
+
'Off'
|
201
|
+
when 1
|
202
|
+
'On'
|
203
|
+
else
|
204
|
+
'Unknown'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
209
|
+
|
210
|
+
#
|
211
|
+
# 0x1031 - PictureMode
|
212
|
+
#
|
213
|
+
class PictureMode < Base
|
214
|
+
|
215
|
+
def to_s
|
216
|
+
case @formatted
|
217
|
+
when 0
|
218
|
+
'Auto'
|
219
|
+
when 1
|
220
|
+
'Portrait scene'
|
221
|
+
when 2
|
222
|
+
'Landscape scene'
|
223
|
+
when 4
|
224
|
+
'Sports scene'
|
225
|
+
when 5
|
226
|
+
'Night scene'
|
227
|
+
when 6
|
228
|
+
'Program Auto Exposure'
|
229
|
+
when 256
|
230
|
+
'Aperture prior Auto Exposure'
|
231
|
+
when 512
|
232
|
+
'Shutter prior Auto Exposure'
|
233
|
+
when 768
|
234
|
+
'Manual exposure'
|
235
|
+
else
|
236
|
+
'Unknown'
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
|
242
|
+
#
|
243
|
+
# 0x1032 - Unknown
|
244
|
+
#
|
245
|
+
|
246
|
+
#
|
247
|
+
# 0x1100 - Cont_Bracket
|
248
|
+
#
|
249
|
+
class Cont_Bracket < Base
|
250
|
+
|
251
|
+
def to_s
|
252
|
+
case @formatted
|
253
|
+
when 0
|
254
|
+
'Off'
|
255
|
+
when 1
|
256
|
+
'On'
|
257
|
+
else
|
258
|
+
'Unknown'
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
def name
|
263
|
+
'Continuous/AutoBracket'
|
264
|
+
end
|
265
|
+
|
266
|
+
end
|
267
|
+
|
268
|
+
#
|
269
|
+
# 0x1200 - Unknown
|
270
|
+
#
|
271
|
+
|
272
|
+
#
|
273
|
+
# 0x1300 - Blur warning
|
274
|
+
#
|
275
|
+
class BlurWarning < Base
|
276
|
+
|
277
|
+
def to_s
|
278
|
+
case @formatted
|
279
|
+
when 0
|
280
|
+
'No blur warning'
|
281
|
+
when 1
|
282
|
+
'Blur warning'
|
283
|
+
else
|
284
|
+
'Unknown'
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
|
290
|
+
#
|
291
|
+
# 0x1301 - Focus warning
|
292
|
+
#
|
293
|
+
class FocusWarning < Base
|
294
|
+
|
295
|
+
def to_s
|
296
|
+
case @formatted
|
297
|
+
when 0
|
298
|
+
'Auto Focus good'
|
299
|
+
when 1
|
300
|
+
'Out of Focus'
|
301
|
+
else
|
302
|
+
'Unknown'
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
307
|
+
|
308
|
+
#
|
309
|
+
# 0x1302 - AE warning
|
310
|
+
#
|
311
|
+
class AutoExposureWarning < Base
|
312
|
+
|
313
|
+
def to_s
|
314
|
+
case @formatted
|
315
|
+
when 0
|
316
|
+
'Auto exposure good'
|
317
|
+
when 1
|
318
|
+
'Over exposure'
|
319
|
+
else
|
320
|
+
'Unknown'
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
end
|
325
|
+
|
326
|
+
end
|
327
|
+
|
328
|
+
#
|
329
|
+
# Tags used in Fujifilm makernote
|
330
|
+
#
|
331
|
+
FujifilmIFDTable = {
|
332
|
+
0x0000 => MakerNote::Version,
|
333
|
+
0x1000 => MakerNote::Quality,
|
334
|
+
0x1001 => MakerNote::Sharpness,
|
335
|
+
0x1002 => MakerNote::White,
|
336
|
+
0x1003 => MakerNote::Color,
|
337
|
+
0x1004 => MakerNote::Tone,
|
338
|
+
0x1010 => MakerNote::FlashMode,
|
339
|
+
0x1011 => MakerNote::FlashStrength,
|
340
|
+
0x1020 => MakerNote::Macro,
|
341
|
+
0x1021 => MakerNote::FocusMode,
|
342
|
+
0x1030 => MakerNote::SlowSync,
|
343
|
+
0x1031 => MakerNote::PictureMode,
|
344
|
+
0x1032 => Unknown,
|
345
|
+
0x1100 => MakerNote::Cont_Bracket,
|
346
|
+
0x1200 => Unknown,
|
347
|
+
0x1300 => MakerNote::BlurWarning,
|
348
|
+
0x1301 => MakerNote::FocusWarning,
|
349
|
+
0x1302 => MakerNote::AutoExposureWarning
|
350
|
+
}
|
351
|
+
|
352
|
+
end
|
353
|
+
|
354
|
+
class Fujifilm
|
355
|
+
|
356
|
+
def initialize(fin, tiff_origin, dataPos, byteOrder_module)
|
357
|
+
@fin = fin
|
358
|
+
@tiffHeader0 = tiff_origin
|
359
|
+
@dataPos = dataPos
|
360
|
+
@byteOrder_module = Utils::Decode::Intel # force Intel
|
361
|
+
self.extend @byteOrder_module
|
362
|
+
end
|
363
|
+
|
364
|
+
def scan_IFD
|
365
|
+
#
|
366
|
+
# Fujifilm MakerNote starts from 8 byte from the origin
|
367
|
+
#
|
368
|
+
@fin.pos = @dataPos + 8
|
369
|
+
offset = decode_ushort(fin_read_n(2))
|
370
|
+
@fin.pos = @dataPos + offset
|
371
|
+
#
|
372
|
+
# get the number of tags
|
373
|
+
#
|
374
|
+
numDirs = decode_ushort(fin_read_n(2))
|
375
|
+
#
|
376
|
+
# now scan them
|
377
|
+
#
|
378
|
+
1.upto(numDirs) {
|
379
|
+
curpos_tag = @fin.pos
|
380
|
+
tag = parseTagID(fin_read_n(2))
|
381
|
+
tagclass = Tag.find(tag.hex, Tag::FujifilmIFDTable)
|
382
|
+
unit, formatter = Tag::Format::Unit[decode_ushort(fin_read_n(2))]
|
383
|
+
count = decode_ulong(fin_read_n(4))
|
384
|
+
tagdata = fin_read_n(4)
|
385
|
+
|
386
|
+
obj = tagclass.new(tag, "MakerNote", count)
|
387
|
+
obj.extend formatter, @byteOrder_module
|
388
|
+
obj.pos = curpos_tag
|
389
|
+
if unit * count > 4
|
390
|
+
curpos = @fin.pos
|
391
|
+
begin
|
392
|
+
@fin.pos = @dataPos + decode_ulong(tagdata)
|
393
|
+
obj.dataPos = @fin.pos
|
394
|
+
obj.data = fin_read_n(unit*count)
|
395
|
+
ensure
|
396
|
+
@fin.pos = curpos
|
397
|
+
end
|
398
|
+
else
|
399
|
+
obj.dataPos = @fin.pos - 4
|
400
|
+
obj.data = tagdata
|
401
|
+
end
|
402
|
+
obj.processData
|
403
|
+
yield obj
|
404
|
+
}
|
405
|
+
end
|
406
|
+
|
407
|
+
private
|
408
|
+
|
409
|
+
def fin_read_n(n)
|
410
|
+
@fin.read(n)
|
411
|
+
end
|
412
|
+
|
413
|
+
end
|
414
|
+
|
415
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#
|
2
|
+
# exifparser/makernote/minolta.rb
|
3
|
+
#
|
4
|
+
# $Revision: 1.2 $
|
5
|
+
# $Date: 2003/05/13 15:41:28 $
|
6
|
+
#
|
7
|
+
require 'exifparser/tag'
|
8
|
+
require 'exifparser/utils'
|
9
|
+
|
10
|
+
module Exif
|
11
|
+
|
12
|
+
module Tag
|
13
|
+
|
14
|
+
module MakerNote
|
15
|
+
end
|
16
|
+
|
17
|
+
MinoltaIFDTable = {
|
18
|
+
}
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
class Minolta
|
23
|
+
|
24
|
+
def initialize(fin, tiff_origin, dataPos, byteOrder_module)
|
25
|
+
@fin = fin
|
26
|
+
@tiffHeader0 = tiff_origin
|
27
|
+
@dataPos = dataPos
|
28
|
+
@byteOrder_module = byteOrder_module
|
29
|
+
self.extend @byteOrder_module
|
30
|
+
end
|
31
|
+
|
32
|
+
def scan_IFD
|
33
|
+
#
|
34
|
+
# Minolta MakerNote starts from 0 byte from the origin
|
35
|
+
#
|
36
|
+
|
37
|
+
@fin.pos = @dataPos + 0
|
38
|
+
|
39
|
+
#
|
40
|
+
# get the number of tags
|
41
|
+
#
|
42
|
+
numDirs = decode_ushort(fin_read_n(2))
|
43
|
+
|
44
|
+
#
|
45
|
+
# now scan them
|
46
|
+
#
|
47
|
+
1.upto(numDirs) {
|
48
|
+
curpos_tag = @fin.pos
|
49
|
+
tag = parseTagID(fin_read_n(2))
|
50
|
+
tagclass = Tag.find(tag.hex, Tag::MinoltaIFDTable)
|
51
|
+
unit, formatter = Tag::Format::Unit[decode_ushort(fin_read_n(2))]
|
52
|
+
count = decode_ulong(fin_read_n(4))
|
53
|
+
tagdata = fin_read_n(4)
|
54
|
+
|
55
|
+
obj = tagclass.new(tag, "MakerNote", count)
|
56
|
+
obj.extend formatter, @byteOrder_module
|
57
|
+
obj.pos = curpos_tag
|
58
|
+
if unit * count > 4
|
59
|
+
curpos = @fin.pos
|
60
|
+
begin
|
61
|
+
@fin.pos = @tiffHeader0 + decode_ulong(tagdata)
|
62
|
+
obj.dataPos = @fin.pos
|
63
|
+
obj.data = fin_read_n(unit*count)
|
64
|
+
ensure
|
65
|
+
@fin.pos = curpos
|
66
|
+
end
|
67
|
+
else
|
68
|
+
obj.dataPos = @fin.pos - 4
|
69
|
+
obj.data = tagdata
|
70
|
+
end
|
71
|
+
obj.processData
|
72
|
+
yield obj
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def fin_read_n(n)
|
79
|
+
@fin.read(n)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|