exifr 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/bin/exifr +1 -1
- data/lib/exif.rb +143 -103
- data/lib/tiff_header.rb +2 -2
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
EXIF Reader 0.9.3
|
2
|
+
* bug fix; "[#4876] Unable to extract gpsinfo"
|
3
|
+
* one-off bug in TiffHeader found and fixed
|
4
|
+
* make "InteroperabilityIndex" available
|
5
|
+
|
1
6
|
EXIF Reader 0.9.2
|
2
7
|
* bug fix; "[#4595] EXIFR::JPEG doesn't support multiple comments", the
|
3
8
|
comment property of a JPEG object now contains an array instead of a string
|
data/bin/exifr
CHANGED
data/lib/exif.rb
CHANGED
@@ -37,106 +37,146 @@ module EXIFR
|
|
37
37
|
class EXIF < Hash
|
38
38
|
TAGS = {} # :nodoc:
|
39
39
|
TAGS.merge!({
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
40
|
+
:exif => {
|
41
|
+
0x0100 => :image_width,
|
42
|
+
0x0101 => :image_length,
|
43
|
+
0x0102 => :bits_per_sample,
|
44
|
+
0x0103 => :compression,
|
45
|
+
0x0106 => :photometric_interpretation,
|
46
|
+
0x010a => :fill_order,
|
47
|
+
0x010d => :document_name,
|
48
|
+
0x010e => :image_description,
|
49
|
+
0x010f => :make,
|
50
|
+
0x0110 => :model,
|
51
|
+
0x0111 => :strip_offsets,
|
52
|
+
0x0112 => :orientation,
|
53
|
+
0x0115 => :samples_per_pixel,
|
54
|
+
0x0116 => :rows_per_strip,
|
55
|
+
0x0117 => :strip_byte_counts,
|
56
|
+
0x011a => :xresolution,
|
57
|
+
0x011b => :yresolution,
|
58
|
+
0x011c => :planar_configuration,
|
59
|
+
0x0128 => :resolution_unit,
|
60
|
+
0x012d => :transfer_function,
|
61
|
+
0x0131 => :software,
|
62
|
+
0x0132 => :date_time,
|
63
|
+
0x013b => :artist,
|
64
|
+
0x013e => :white_point,
|
65
|
+
0x013f => :primary_chromaticities,
|
66
|
+
0x0156 => :transfer_range,
|
67
|
+
0x0200 => :jpegproc,
|
68
|
+
0x0201 => :jpeg_interchange_format,
|
69
|
+
0x0202 => :jpeg_interchange_format_length,
|
70
|
+
0x0211 => :ycb_cr_coefficients,
|
71
|
+
0x0212 => :ycb_cr_sub_sampling,
|
72
|
+
0x0213 => :ycb_cr_positioning,
|
73
|
+
0x0214 => :reference_black_white,
|
74
|
+
0x828d => :cfarepeat_pattern_dim,
|
75
|
+
0x828e => :cfapattern,
|
76
|
+
0x828f => :battery_level,
|
77
|
+
0x8298 => :copyright,
|
78
|
+
0x829a => :exposure_time,
|
79
|
+
0x829d => :fnumber,
|
80
|
+
0x83bb => :iptc_naa,
|
81
|
+
0x8769 => :exif,
|
82
|
+
0x8773 => :inter_color_profile,
|
83
|
+
0x8822 => :exposure_program,
|
84
|
+
0x8824 => :spectral_sensitivity,
|
85
|
+
0x8825 => :gps,
|
86
|
+
0x8827 => :isospeed_ratings,
|
87
|
+
0x8828 => :oecf,
|
88
|
+
0x9000 => :exif_version,
|
89
|
+
0x9003 => :date_time_original,
|
90
|
+
0x9004 => :date_time_digitized,
|
91
|
+
0x9101 => :components_configuration,
|
92
|
+
0x9102 => :compressed_bits_per_pixel,
|
93
|
+
0x9201 => :shutter_speed_value,
|
94
|
+
0x9202 => :aperture_value,
|
95
|
+
0x9203 => :brightness_value,
|
96
|
+
0x9204 => :exposure_bias_value,
|
97
|
+
0x9205 => :max_aperture_value,
|
98
|
+
0x9206 => :subject_distance,
|
99
|
+
0x9207 => :metering_mode,
|
100
|
+
0x9208 => :light_source,
|
101
|
+
0x9209 => :flash,
|
102
|
+
0x920a => :focal_length,
|
103
|
+
0x9214 => :subject_area,
|
104
|
+
0x927c => :maker_note,
|
105
|
+
0x9286 => :user_comment,
|
106
|
+
0x9290 => :subsec_time,
|
107
|
+
0x9291 => :subsec_time_orginal,
|
108
|
+
0x9292 => :subsec_time_digitized,
|
109
|
+
0xa000 => :flash_pix_version,
|
110
|
+
0xa001 => :color_space,
|
111
|
+
0xa002 => :pixel_xdimension,
|
112
|
+
0xa003 => :pixel_ydimension,
|
113
|
+
0xa004 => :related_sound_file,
|
114
|
+
0xa005 => :interoperability,
|
115
|
+
0xa20b => :flash_energy,
|
116
|
+
0xa20c => :spatial_frequency_response,
|
117
|
+
0xa20e => :focal_plane_xresolution,
|
118
|
+
0xa20f => :focal_plane_yresolution,
|
119
|
+
0xa210 => :focal_plane_resolution_unit,
|
120
|
+
0xa214 => :subject_location,
|
121
|
+
0xa215 => :exposure_index,
|
122
|
+
0xa217 => :sensing_method,
|
123
|
+
0xa300 => :file_source,
|
124
|
+
0xa301 => :scene_type,
|
125
|
+
0xa302 => :cfapattern,
|
126
|
+
0xa401 => :custom_rendered,
|
127
|
+
0xa402 => :exposure_mode,
|
128
|
+
0xa403 => :white_balance,
|
129
|
+
0xa404 => :digital_zoom_ratio,
|
130
|
+
0xa405 => :focal_len_in_35mm_film,
|
131
|
+
0xa406 => :scene_capture_type,
|
132
|
+
0xa407 => :gain_control,
|
133
|
+
0xa408 => :contrast,
|
134
|
+
0xa409 => :saturation,
|
135
|
+
0xa40a => :sharpness,
|
136
|
+
0xa40b => :device_setting_descr,
|
137
|
+
0xa40c => :subject_dist_range,
|
138
|
+
0xa420 => :image_unique_id
|
139
|
+
},
|
140
|
+
|
141
|
+
:gps => {
|
142
|
+
0x0000 => :gps_version_id,
|
143
|
+
0x0001 => :gps_latitude_ref,
|
144
|
+
0x0002 => :gps_latitude,
|
145
|
+
0x0003 => :gps_longitude_ref,
|
146
|
+
0x0004 => :gps_longitude,
|
147
|
+
0x0005 => :gps_altitude_ref,
|
148
|
+
0x0006 => :gps_altitude ,
|
149
|
+
0x0007 => :gps_time_stamp,
|
150
|
+
0x0008 => :gps_satellites,
|
151
|
+
0x0009 => :gps_status,
|
152
|
+
0x000a => :gps_measure_mode,
|
153
|
+
0x000b => :gpsdop,
|
154
|
+
0x000c => :gps_speed_ref,
|
155
|
+
0x000d => :gps_speed ,
|
156
|
+
0x000e => :gps_track_ref,
|
157
|
+
0x000f => :gps_track,
|
158
|
+
0x0010 => :gps_img_direction_ref,
|
159
|
+
0x0011 => :gps_img_direction,
|
160
|
+
0x0012 => :gps_map_datum,
|
161
|
+
0x0013 => :gps_dest_latitude_ref,
|
162
|
+
0x0014 => :gps_dest_latitude,
|
163
|
+
0x0015 => :gps_dest_longitude_ref,
|
164
|
+
0x0016 => :gps_dest_longitude,
|
165
|
+
0x0017 => :gps_dest_bearing_ref,
|
166
|
+
0x0018 => :gps_dest_bearing,
|
167
|
+
0x0019 => :gps_dest_distance_ref,
|
168
|
+
0x001a => :gps_dest_distance,
|
169
|
+
0x001b => :gps_processing_method,
|
170
|
+
0x001c => :gps_area_information,
|
171
|
+
0x001d => :gps_date_stamp,
|
172
|
+
0x001e => :gps_differential,
|
173
|
+
},
|
174
|
+
|
175
|
+
:interoperability => {
|
176
|
+
0x0001 => :interoperability_index
|
177
|
+
}
|
138
178
|
})
|
139
|
-
EXIF_HEADERS = [
|
179
|
+
EXIF_HEADERS = [:exif, :gps, :interoperability] # :nodoc:
|
140
180
|
|
141
181
|
time_proc = proc do |value|
|
142
182
|
if value =~ /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/
|
@@ -197,13 +237,13 @@ module EXIFR
|
|
197
237
|
end
|
198
238
|
|
199
239
|
private
|
200
|
-
def traverse(tiff)
|
240
|
+
def traverse(tiff, ifd = :exif)
|
201
241
|
tiff.fields.each do |f|
|
202
|
-
tag = TAGS[f.tag]
|
242
|
+
tag = TAGS[ifd][f.tag]
|
203
243
|
value = f.value.map { |v| ADAPTERS[tag][v] } if f.value
|
204
244
|
value = (value.kind_of?(Array) && value.size == 1) ? value.first : value
|
205
|
-
if EXIF_HEADERS.include?(
|
206
|
-
traverse(TiffHeader.new(@data, f.offset))
|
245
|
+
if EXIF_HEADERS.include?(tag)
|
246
|
+
traverse(TiffHeader.new(@data, f.offset), tag)
|
207
247
|
elsif tag
|
208
248
|
self[tag] = value
|
209
249
|
end
|
data/lib/tiff_header.rb
CHANGED
@@ -51,7 +51,7 @@ module EXIFR
|
|
51
51
|
# TODO handle signed bytes
|
52
52
|
len, pack = count, proc { |d| d }
|
53
53
|
when 2 # ascii
|
54
|
-
len, pack = count, proc { |d| d.
|
54
|
+
len, pack = count, proc { |d| d.strip }
|
55
55
|
when 3, 8 # short, signed short
|
56
56
|
# TODO handle signed
|
57
57
|
len, pack = count * 2, proc { |d| d.unpack(data.short + '*') }
|
@@ -76,7 +76,7 @@ module EXIFR
|
|
76
76
|
|
77
77
|
if len && pack
|
78
78
|
start = len > 4 ? @offset : (pos + 8)
|
79
|
-
@value = pack[data[start..(start + len)]]
|
79
|
+
@value = pack[data[start..(start + len - 1)]]
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: exifr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.9.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.9.3
|
7
|
+
date: 2006-06-29 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
|