exif 0.9.0 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5f29f76bf91ba37f5eb1a1e0478b65552e5c82e
4
- data.tar.gz: afce46bfa42cb13bdb7d59f80d3c069dbb054486
3
+ metadata.gz: 5e2d459e26e4c1bc0cc6c02e6c1e87c8a7168796
4
+ data.tar.gz: e430895590e8ceaa7595f19c38aa0b062780c527
5
5
  SHA512:
6
- metadata.gz: 747ab5defb0329b534fec43e4312023352b92e370672814c9b6bdeff0a467874217ce2ed2d1325eb73d4b6f242d67ccb033cdd7960b263c0ab49ae7fcbe8d329
7
- data.tar.gz: f6d9b9757c9148eb555f83450feeb417df157728bd3758d8476a7a20fa2dcca89df63c2daeec1900ac5caf70ccdc03e9cbd3bb73dc60745032809d07e5e8a75b
6
+ metadata.gz: 5e5b91c5f772dbdc7c8bef203b2101b8f57122c081a30ef841da082de6ba42cd8c942698024678136930ae895a95f59931b28ea4dc7e988d2f4445ae5d38bf48
7
+ data.tar.gz: 9dd8285f7a418fed4bf545be7039feb702bd246aa524754090a88196a573adbd491c9a005736c3eaff8458338bdeaabb182d6e02cf83756eed229f2daf1d4395
data/README.md CHANGED
@@ -10,8 +10,8 @@ Ruby wrapper for libexif
10
10
 
11
11
  ```ruby
12
12
  data = Exif::Data.new('sample.jpg')
13
- data[:image_width] # => 4000
14
- data[:gps_latitude] # => '24, 10.6817, 0'
13
+ data.image_width # => 4000
14
+ data.gps_latitude # => '24, 10.6817, 0'
15
15
 
16
16
  # get all entries in an IFD
17
17
  data[0] # => {image_width: 4000, image_length: 2670, ...}
@@ -19,6 +19,7 @@ data[1] # => {x_resolution: "72"}, y_resolution: "72", ...}
19
19
  data[:exif] # => exposure_time: "1/125 sec.", f_number: "f/8.0"}
20
20
  data[:gps] # => {gps_version_id: "2.2.0.0", gps_latitude_ref: "N", ...}
21
21
  data[:interoperability] # => {...}
22
+ data.to_h # => {0 => {...}, 1 => {...}, :exif => {...}}
22
23
  ```
23
24
 
24
25
  ## Tag Rreference
@@ -174,5 +175,4 @@ data[:interoperability] # => {...}
174
175
 
175
176
  # TODO
176
177
 
177
- 1. `Exif.underscore!` is too slow
178
- 2. Support reading from String.
178
+ 1. Support reading from String.
@@ -0,0 +1,23 @@
1
+ $: << File.expand_path('../../lib', __FILE__)
2
+ require 'benchmark'
3
+ require 'exif'
4
+ require 'exifr'
5
+
6
+ N = 500
7
+ FILE_PATH = File.expand_path('../../spec/sample.jpg', __FILE__)
8
+ exifr = EXIFR::JPEG.new(FILE_PATH)
9
+ exif = Exif::Data.new(FILE_PATH)
10
+ Benchmark.bmbm do |x|
11
+ x.report '[exifr] init' do
12
+ N.times{ EXIFR::JPEG.new(FILE_PATH).width }
13
+ end
14
+ x.report '[exif] init' do
15
+ N.times{ Exif::Data.new(FILE_PATH).image_width }
16
+ end
17
+ x.report '[exifr] get width' do
18
+ N.times{ exifr.width }
19
+ end
20
+ x.report '[exif] get width' do
21
+ N.times{ exif.image_width }
22
+ end
23
+ end
data/ext/exif/data.c CHANGED
@@ -7,11 +7,15 @@ static VALUE IFD2SYM[5];
7
7
 
8
8
  void init_data(){
9
9
  rb_cData = rb_define_class_under(rb_mExif, "Data", rb_cObject);
10
- IFD2SYM[0] = INT2NUM(0); // EXIF_IFD_0
11
- IFD2SYM[1] = INT2NUM(1); // EXIF_IFD_1
12
- IFD2SYM[2] = ID2SYM(rb_intern("exif")); // EXIF_IFD_EXIF
13
- IFD2SYM[3] = ID2SYM(rb_intern("gps")); // EXIF_IFD_GPS
14
- IFD2SYM[4] = ID2SYM(rb_intern("interoperability")); // EXIF_IFD_INTEROPERABILITY
10
+ IFD2SYM[EXIF_IFD_0] = INT2NUM(0);
11
+ IFD2SYM[EXIF_IFD_1] = INT2NUM(1);
12
+ IFD2SYM[EXIF_IFD_EXIF] = ID2SYM(rb_intern("exif"));
13
+ IFD2SYM[EXIF_IFD_GPS] = ID2SYM(rb_intern("gps"));
14
+ IFD2SYM[EXIF_IFD_INTEROPERABILITY] = ID2SYM(rb_intern("interoperability"));
15
+ int length = sizeof(attrs) / sizeof(char*);
16
+ for(int i = 0; i < length; ++i) rb_define_attr(rb_cData, attrs[i], 1, 0);
17
+ rb_define_attr(rb_cData, "contents", 1, 0);
18
+ rb_define_alias(rb_cData, "to_h", "contents");
15
19
  rb_define_singleton_method(rb_cData, "new", rb_new, 1);
16
20
  rb_define_method(rb_cData, "dump", rb_dump, 0);
17
21
  rb_define_method(rb_cData, "[]", rb_value, 1);
@@ -22,10 +26,8 @@ static VALUE rb_new(VALUE self, VALUE file_path){
22
26
  ExifData *ed = exif_data_new_from_file(StringValueCStr(file_path));
23
27
  if(!ed) rb_raise(rb_eRuntimeError, "File not readable or no EXIF data in file.");
24
28
  VALUE rb_data = Data_Wrap_Struct(self, NULL, exif_data_free, ed);
25
- rb_define_attr(self, "contents", 1, 0);
26
- VALUE rb_h = rb_hash_new();
27
- exif_data_foreach_content(ed, each_content, &rb_h);
28
- rb_iv_set(rb_data, "@contents", rb_h);
29
+ rb_iv_set(rb_data, "@contents", rb_hash_new());
30
+ exif_data_foreach_content(ed, each_content, &rb_data);
29
31
  return rb_data;
30
32
  }
31
33
 
@@ -41,21 +43,23 @@ static VALUE rb_value(VALUE self, VALUE key){
41
43
  return rb_hash_aref(rb_contents, key);
42
44
  }
43
45
 
44
- static void each_content(ExifContent *ec, void *rb_h_ptr){
45
- VALUE *rb_h = (VALUE*)rb_h_ptr;
46
+ static void each_content(ExifContent *ec, void *self_ptr){
47
+ VALUE *self = (VALUE*)self_ptr;
48
+ VALUE rb_contents = rb_iv_get(*self, "@contents");
49
+ Check_Type(rb_contents, T_HASH);
46
50
  ExifIfd ifd = exif_content_get_ifd(ec);
47
51
  VALUE ifd_name = IFD2SYM[ifd]; //rb_str_new_cstr(exif_ifd_get_name(ifd));
48
52
  if(ifd == EXIF_IFD_COUNT) rb_raise(rb_eRuntimeError, "Con't get IFD.");
49
- else rb_hash_aset(*rb_h, ifd_name, rb_hash_new());
50
- exif_content_foreach_entry(ec, each_entry, rb_h_ptr);
53
+ else rb_hash_aset(rb_contents, ifd_name, rb_hash_new());
54
+ exif_content_foreach_entry(ec, each_entry, self);
51
55
  }
52
56
 
53
- static void each_entry(ExifEntry *ee, void *rb_h_ptr){
54
- VALUE *rb_h = (VALUE*)rb_h_ptr;
57
+ static void each_entry(ExifEntry *ee, void *self_ptr){
58
+ VALUE *self = (VALUE*)self_ptr;
59
+ VALUE rb_contents = rb_iv_get(*self, "@contents");
55
60
  ExifIfd ifd = exif_entry_get_ifd(ee);
56
- VALUE tag_name = rb_str_new_cstr(exif_tag_get_name_in_ifd(ee->tag, ifd));
57
- rb_funcall(rb_mExif, rb_intern("underscore!"), 1, tag_name);
58
- tag_name = ID2SYM(rb_intern_str(tag_name));
61
+ char *attr_name = attr_string(ifd, ee->tag);
62
+ VALUE tag_name = ID2SYM(rb_intern(attr_name + 1));
59
63
  char buf[500];
60
64
  exif_entry_get_value(ee, buf, sizeof(buf));
61
65
  VALUE value;
@@ -91,6 +95,451 @@ static void each_entry(ExifEntry *ee, void *rb_h_ptr){
91
95
  default:
92
96
  value = rb_str_new_cstr(buf);
93
97
  }
94
- rb_hash_aset(rb_hash_aref(*rb_h, IFD2SYM[ifd]), tag_name, value);
95
- if(NIL_P(rb_hash_aref(*rb_h, tag_name))) rb_hash_aset(*rb_h, tag_name, value);
98
+ rb_hash_aset(rb_hash_aref(rb_contents, IFD2SYM[ifd]), tag_name, value);
99
+ rb_hash_aset(rb_contents, tag_name, value);
100
+ rb_iv_set(*self, attr_name, value);
101
+ }
102
+
103
+ static char* attr_string(ExifIfd ifd, ExifTag tag){
104
+ switch((int)tag){
105
+ case EXIF_TAG_INTEROPERABILITY_INDEX: /* EXIF_TAG_GPS_LATITUDE_REF */
106
+ return ifd == EXIF_IFD_GPS ? "@gps_latitude_ref" : "@interoperability_index";
107
+ break;
108
+ case EXIF_TAG_INTEROPERABILITY_VERSION: /* EXIF_TAG_GPS_LATITUDE */
109
+ return ifd == EXIF_IFD_GPS ? "@gps_latitude" : "@interoperability_version";
110
+ break;
111
+ case EXIF_TAG_NEW_SUBFILE_TYPE:
112
+ return "@new_subfile_type";
113
+ break;
114
+ case EXIF_TAG_IMAGE_WIDTH:
115
+ return "@image_width";
116
+ break;
117
+ case EXIF_TAG_IMAGE_LENGTH:
118
+ return "@image_length";
119
+ break;
120
+ case EXIF_TAG_BITS_PER_SAMPLE:
121
+ return "@bits_per_sample";
122
+ break;
123
+ case EXIF_TAG_COMPRESSION:
124
+ return "@compression";
125
+ break;
126
+ case EXIF_TAG_PHOTOMETRIC_INTERPRETATION:
127
+ return "@photometric_interpretation";
128
+ break;
129
+ case EXIF_TAG_FILL_ORDER:
130
+ return "@fill_order";
131
+ break;
132
+ case EXIF_TAG_DOCUMENT_NAME:
133
+ return "@document_name";
134
+ break;
135
+ case EXIF_TAG_IMAGE_DESCRIPTION:
136
+ return "@image_description";
137
+ break;
138
+ case EXIF_TAG_MAKE:
139
+ return "@make";
140
+ break;
141
+ case EXIF_TAG_MODEL:
142
+ return "@model";
143
+ break;
144
+ case EXIF_TAG_STRIP_OFFSETS:
145
+ return "@strip_offsets";
146
+ break;
147
+ case EXIF_TAG_ORIENTATION:
148
+ return "@orientation";
149
+ break;
150
+ case EXIF_TAG_SAMPLES_PER_PIXEL:
151
+ return "@samples_per_pixel";
152
+ break;
153
+ case EXIF_TAG_ROWS_PER_STRIP:
154
+ return "@rows_per_strip";
155
+ break;
156
+ case EXIF_TAG_STRIP_BYTE_COUNTS:
157
+ return "@strip_byte_counts";
158
+ break;
159
+ case EXIF_TAG_X_RESOLUTION:
160
+ return "@x_resolution";
161
+ break;
162
+ case EXIF_TAG_Y_RESOLUTION:
163
+ return "@y_resolution";
164
+ break;
165
+ case EXIF_TAG_PLANAR_CONFIGURATION:
166
+ return "@planar_configuration";
167
+ break;
168
+ case EXIF_TAG_RESOLUTION_UNIT:
169
+ return "@resolution_unit";
170
+ break;
171
+ case EXIF_TAG_TRANSFER_FUNCTION:
172
+ return "@transfer_function";
173
+ break;
174
+ case EXIF_TAG_SOFTWARE:
175
+ return "@software";
176
+ break;
177
+ case EXIF_TAG_DATE_TIME:
178
+ return "@date_time";
179
+ break;
180
+ case EXIF_TAG_ARTIST:
181
+ return "@artist";
182
+ break;
183
+ case EXIF_TAG_WHITE_POINT:
184
+ return "@white_point";
185
+ break;
186
+ case EXIF_TAG_PRIMARY_CHROMATICITIES:
187
+ return "@primary_chromaticities";
188
+ break;
189
+ case EXIF_TAG_SUB_IFDS:
190
+ return "@sub_ifds";
191
+ break;
192
+ case EXIF_TAG_TRANSFER_RANGE:
193
+ return "@transfer_range";
194
+ break;
195
+ case EXIF_TAG_JPEG_PROC:
196
+ return "@jpeg_proc";
197
+ break;
198
+ case EXIF_TAG_JPEG_INTERCHANGE_FORMAT:
199
+ return "@jpeg_interchange_format";
200
+ break;
201
+ case EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH:
202
+ return "@jpeg_interchange_format_length";
203
+ break;
204
+ case EXIF_TAG_YCBCR_COEFFICIENTS:
205
+ return "@ycbcr_coefficients";
206
+ break;
207
+ case EXIF_TAG_YCBCR_SUB_SAMPLING:
208
+ return "@ycbcr_sub_sampling";
209
+ break;
210
+ case EXIF_TAG_YCBCR_POSITIONING:
211
+ return "@ycbcr_positioning";
212
+ break;
213
+ case EXIF_TAG_REFERENCE_BLACK_WHITE:
214
+ return "@reference_black_white";
215
+ break;
216
+ case EXIF_TAG_XML_PACKET:
217
+ return "@xml_packet";
218
+ break;
219
+ case EXIF_TAG_RELATED_IMAGE_FILE_FORMAT:
220
+ return "@related_image_file_format";
221
+ break;
222
+ case EXIF_TAG_RELATED_IMAGE_WIDTH:
223
+ return "@related_image_width";
224
+ break;
225
+ case EXIF_TAG_RELATED_IMAGE_LENGTH:
226
+ return "@related_image_length";
227
+ break;
228
+ case EXIF_TAG_CFA_REPEAT_PATTERN_DIM:
229
+ return "@cfa_repeat_pattern_dim";
230
+ break;
231
+ case EXIF_TAG_CFA_PATTERN:
232
+ return "@cfa_pattern";
233
+ break;
234
+ case EXIF_TAG_BATTERY_LEVEL:
235
+ return "@battery_level";
236
+ break;
237
+ case EXIF_TAG_COPYRIGHT:
238
+ return "@copyright";
239
+ break;
240
+ case EXIF_TAG_EXPOSURE_TIME:
241
+ return "@exposure_time";
242
+ break;
243
+ case EXIF_TAG_FNUMBER:
244
+ return "@fnumber";
245
+ break;
246
+ case EXIF_TAG_IPTC_NAA:
247
+ return "@iptc_naa";
248
+ break;
249
+ case EXIF_TAG_IMAGE_RESOURCES:
250
+ return "@image_resources";
251
+ break;
252
+ case EXIF_TAG_EXIF_IFD_POINTER:
253
+ return "@exif_ifd_pointer";
254
+ break;
255
+ case EXIF_TAG_INTER_COLOR_PROFILE:
256
+ return "@inter_color_profile";
257
+ break;
258
+ case EXIF_TAG_EXPOSURE_PROGRAM:
259
+ return "@exposure_program";
260
+ break;
261
+ case EXIF_TAG_SPECTRAL_SENSITIVITY:
262
+ return "@spectral_sensitivity";
263
+ break;
264
+ case EXIF_TAG_GPS_INFO_IFD_POINTER:
265
+ return "@gps_info_ifd_pointer";
266
+ break;
267
+ case EXIF_TAG_ISO_SPEED_RATINGS:
268
+ return "@iso_speed_ratings";
269
+ break;
270
+ case EXIF_TAG_OECF:
271
+ return "@oecf";
272
+ break;
273
+ case EXIF_TAG_TIME_ZONE_OFFSET:
274
+ return "@time_zone_offset";
275
+ break;
276
+ case EXIF_TAG_EXIF_VERSION:
277
+ return "@exif_version";
278
+ break;
279
+ case EXIF_TAG_DATE_TIME_ORIGINAL:
280
+ return "@date_time_original";
281
+ break;
282
+ case EXIF_TAG_DATE_TIME_DIGITIZED:
283
+ return "@date_time_digitized";
284
+ break;
285
+ case EXIF_TAG_COMPONENTS_CONFIGURATION:
286
+ return "@components_configuration";
287
+ break;
288
+ case EXIF_TAG_COMPRESSED_BITS_PER_PIXEL:
289
+ return "@compressed_bits_per_pixel";
290
+ break;
291
+ case EXIF_TAG_SHUTTER_SPEED_VALUE:
292
+ return "@shutter_speed_value";
293
+ break;
294
+ case EXIF_TAG_APERTURE_VALUE:
295
+ return "@aperture_value";
296
+ break;
297
+ case EXIF_TAG_BRIGHTNESS_VALUE:
298
+ return "@brightness_value";
299
+ break;
300
+ case EXIF_TAG_EXPOSURE_BIAS_VALUE:
301
+ return "@exposure_bias_value";
302
+ break;
303
+ case EXIF_TAG_MAX_APERTURE_VALUE:
304
+ return "@max_aperture_value";
305
+ break;
306
+ case EXIF_TAG_SUBJECT_DISTANCE:
307
+ return "@subject_distance";
308
+ break;
309
+ case EXIF_TAG_METERING_MODE:
310
+ return "@metering_mode";
311
+ break;
312
+ case EXIF_TAG_LIGHT_SOURCE:
313
+ return "@light_source";
314
+ break;
315
+ case EXIF_TAG_FLASH:
316
+ return "@flash";
317
+ break;
318
+ case EXIF_TAG_FOCAL_LENGTH:
319
+ return "@focal_length";
320
+ break;
321
+ case EXIF_TAG_SUBJECT_AREA:
322
+ return "@subject_area";
323
+ break;
324
+ case EXIF_TAG_TIFF_EP_STANDARD_ID:
325
+ return "@tiff_ep_standard_id";
326
+ break;
327
+ case EXIF_TAG_MAKER_NOTE:
328
+ return "@maker_note";
329
+ break;
330
+ case EXIF_TAG_USER_COMMENT:
331
+ return "@user_comment";
332
+ break;
333
+ case EXIF_TAG_SUB_SEC_TIME:
334
+ return "@sub_sec_time";
335
+ break;
336
+ case EXIF_TAG_SUB_SEC_TIME_ORIGINAL:
337
+ return "@sub_sec_time_original";
338
+ break;
339
+ case EXIF_TAG_SUB_SEC_TIME_DIGITIZED:
340
+ return "@sub_sec_time_digitized";
341
+ break;
342
+ case EXIF_TAG_XP_TITLE:
343
+ return "@xp_title";
344
+ break;
345
+ case EXIF_TAG_XP_COMMENT:
346
+ return "@xp_comment";
347
+ break;
348
+ case EXIF_TAG_XP_AUTHOR:
349
+ return "@xp_author";
350
+ break;
351
+ case EXIF_TAG_XP_KEYWORDS:
352
+ return "@xp_keywords";
353
+ break;
354
+ case EXIF_TAG_XP_SUBJECT:
355
+ return "@xp_subject";
356
+ break;
357
+ case EXIF_TAG_FLASH_PIX_VERSION:
358
+ return "@flash_pix_version";
359
+ break;
360
+ case EXIF_TAG_COLOR_SPACE:
361
+ return "@color_space";
362
+ break;
363
+ case EXIF_TAG_PIXEL_X_DIMENSION:
364
+ return "@pixel_x_dimension";
365
+ break;
366
+ case EXIF_TAG_PIXEL_Y_DIMENSION:
367
+ return "@pixel_y_dimension";
368
+ break;
369
+ case EXIF_TAG_RELATED_SOUND_FILE:
370
+ return "@related_sound_file";
371
+ break;
372
+ case EXIF_TAG_INTEROPERABILITY_IFD_POINTER:
373
+ return "@interoperability_ifd_pointer";
374
+ break;
375
+ case EXIF_TAG_FLASH_ENERGY:
376
+ return "@flash_energy";
377
+ break;
378
+ case EXIF_TAG_SPATIAL_FREQUENCY_RESPONSE:
379
+ return "@spatial_frequency_response";
380
+ break;
381
+ case EXIF_TAG_FOCAL_PLANE_X_RESOLUTION:
382
+ return "@focal_plane_x_resolution";
383
+ break;
384
+ case EXIF_TAG_FOCAL_PLANE_Y_RESOLUTION:
385
+ return "@focal_plane_y_resolution";
386
+ break;
387
+ case EXIF_TAG_FOCAL_PLANE_RESOLUTION_UNIT:
388
+ return "@focal_plane_resolution_unit";
389
+ break;
390
+ case EXIF_TAG_SUBJECT_LOCATION:
391
+ return "@subject_location";
392
+ break;
393
+ case EXIF_TAG_EXPOSURE_INDEX:
394
+ return "@exposure_index";
395
+ break;
396
+ case EXIF_TAG_SENSING_METHOD:
397
+ return "@sensing_method";
398
+ break;
399
+ case EXIF_TAG_FILE_SOURCE:
400
+ return "@file_source";
401
+ break;
402
+ case EXIF_TAG_SCENE_TYPE:
403
+ return "@scene_type";
404
+ break;
405
+ case EXIF_TAG_NEW_CFA_PATTERN:
406
+ return "@new_cfa_pattern";
407
+ break;
408
+ case EXIF_TAG_CUSTOM_RENDERED:
409
+ return "@custom_rendered";
410
+ break;
411
+ case EXIF_TAG_EXPOSURE_MODE:
412
+ return "@exposure_mode";
413
+ break;
414
+ case EXIF_TAG_WHITE_BALANCE:
415
+ return "@white_balance";
416
+ break;
417
+ case EXIF_TAG_DIGITAL_ZOOM_RATIO:
418
+ return "@digital_zoom_ratio";
419
+ break;
420
+ case EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM:
421
+ return "@focal_length_in_35mm_film";
422
+ break;
423
+ case EXIF_TAG_SCENE_CAPTURE_TYPE:
424
+ return "@scene_capture_type";
425
+ break;
426
+ case EXIF_TAG_GAIN_CONTROL:
427
+ return "@gain_control";
428
+ break;
429
+ case EXIF_TAG_CONTRAST:
430
+ return "@contrast";
431
+ break;
432
+ case EXIF_TAG_SATURATION:
433
+ return "@saturation";
434
+ break;
435
+ case EXIF_TAG_SHARPNESS:
436
+ return "@sharpness";
437
+ break;
438
+ case EXIF_TAG_DEVICE_SETTING_DESCRIPTION:
439
+ return "@device_setting_description";
440
+ break;
441
+ case EXIF_TAG_SUBJECT_DISTANCE_RANGE:
442
+ return "@subject_distance_range";
443
+ break;
444
+ case EXIF_TAG_IMAGE_UNIQUE_ID:
445
+ return "@image_unique_id";
446
+ break;
447
+ case EXIF_TAG_GAMMA:
448
+ return "@gamma";
449
+ break;
450
+ case EXIF_TAG_PRINT_IMAGE_MATCHING:
451
+ return "@print_image_matching";
452
+ break;
453
+ case EXIF_TAG_PADDING:
454
+ return "@padding";
455
+ break;
456
+ case EXIF_TAG_GPS_VERSION_ID:
457
+ return "@gps_version_id";
458
+ break;
459
+ case EXIF_TAG_GPS_LONGITUDE_REF:
460
+ return "@gps_longitude_ref";
461
+ break;
462
+ case EXIF_TAG_GPS_LONGITUDE:
463
+ return "@gps_longitude";
464
+ break;
465
+ case EXIF_TAG_GPS_ALTITUDE_REF:
466
+ return "@gps_altitude_ref";
467
+ break;
468
+ case EXIF_TAG_GPS_ALTITUDE:
469
+ return "@gps_altitude";
470
+ break;
471
+ case EXIF_TAG_GPS_TIME_STAMP:
472
+ return "@gps_time_stamp";
473
+ break;
474
+ case EXIF_TAG_GPS_SATELLITES:
475
+ return "@gps_satellites";
476
+ break;
477
+ case EXIF_TAG_GPS_STATUS:
478
+ return "@gps_status";
479
+ break;
480
+ case EXIF_TAG_GPS_MEASURE_MODE:
481
+ return "@gps_measure_mode";
482
+ break;
483
+ case EXIF_TAG_GPS_DOP:
484
+ return "@gps_dop";
485
+ break;
486
+ case EXIF_TAG_GPS_SPEED_REF:
487
+ return "@gps_speed_ref";
488
+ break;
489
+ case EXIF_TAG_GPS_SPEED:
490
+ return "@gps_speed";
491
+ break;
492
+ case EXIF_TAG_GPS_TRACK_REF:
493
+ return "@gps_track_ref";
494
+ break;
495
+ case EXIF_TAG_GPS_TRACK:
496
+ return "@gps_track";
497
+ break;
498
+ case EXIF_TAG_GPS_IMG_DIRECTION_REF:
499
+ return "@gps_img_direction_ref";
500
+ break;
501
+ case EXIF_TAG_GPS_IMG_DIRECTION:
502
+ return "@gps_img_direction";
503
+ break;
504
+ case EXIF_TAG_GPS_MAP_DATUM:
505
+ return "@gps_map_datum";
506
+ break;
507
+ case EXIF_TAG_GPS_DEST_LATITUDE_REF:
508
+ return "@gps_dest_latitude_ref";
509
+ break;
510
+ case EXIF_TAG_GPS_DEST_LATITUDE:
511
+ return "@gps_dest_latitude";
512
+ break;
513
+ case EXIF_TAG_GPS_DEST_LONGITUDE_REF:
514
+ return "@gps_dest_longitude_ref";
515
+ break;
516
+ case EXIF_TAG_GPS_DEST_LONGITUDE:
517
+ return "@gps_dest_longitude";
518
+ break;
519
+ case EXIF_TAG_GPS_DEST_BEARING_REF:
520
+ return "@gps_dest_bearing_ref";
521
+ break;
522
+ case EXIF_TAG_GPS_DEST_BEARING:
523
+ return "@gps_dest_bearing";
524
+ break;
525
+ case EXIF_TAG_GPS_DEST_DISTANCE_REF:
526
+ return "@gps_dest_distance_ref";
527
+ break;
528
+ case EXIF_TAG_GPS_DEST_DISTANCE:
529
+ return "@gps_dest_distance";
530
+ break;
531
+ case EXIF_TAG_GPS_PROCESSING_METHOD:
532
+ return "@gps_processing_method";
533
+ break;
534
+ case EXIF_TAG_GPS_AREA_INFORMATION:
535
+ return "@gps_area_information";
536
+ break;
537
+ case EXIF_TAG_GPS_DATE_STAMP:
538
+ return "@gps_date_stamp";
539
+ break;
540
+ case EXIF_TAG_GPS_DIFFERENTIAL:
541
+ return "@gps_differential";
542
+ break;
543
+ }
544
+ return NULL;
96
545
  }
data/ext/exif/data.h CHANGED
@@ -4,6 +4,8 @@
4
4
  #include <libexif/exif-data.h>
5
5
  #include "ruby.h"
6
6
 
7
+ static char *attrs[] = {"aperture_value", "artist", "battery_level", "bits_per_sample", "brightness_value", "cfa_pattern", "cfa_repeat_pattern_dim", "color_space", "components_configuration", "compressed_bits_per_pixel", "compression", "contrast", "copyright", "custom_rendered", "date_time", "date_time_digitized", "date_time_original", "device_setting_description", "digital_zoom_ratio", "document_name", "exif_ifd_pointer", "exif_version", "exposure_bias_value", "exposure_index", "exposure_mode", "exposure_program", "exposure_time", "file_source", "fill_order", "flash", "flash_energy", "flash_pix_version", "fnumber", "focal_length", "focal_length_in_35mm_film", "focal_plane_resolution_unit", "focal_plane_x_resolution", "focal_plane_y_resolution", "gain_control", "gamma", "gps_altitude", "gps_altitude_ref", "gps_area_information", "gps_date_stamp", "gps_dest_bearing", "gps_dest_bearing_ref", "gps_dest_distance", "gps_dest_distance_ref", "gps_dest_latitude", "gps_dest_latitude_ref", "gps_dest_longitude", "gps_dest_longitude_ref", "gps_differential", "gps_dop", "gps_img_direction", "gps_img_direction_ref", "gps_info_ifd_pointer", "gps_latitude", "gps_latitude_ref", "gps_longitude", "gps_longitude_ref", "gps_map_datum", "gps_measure_mode", "gps_processing_method", "gps_satellites", "gps_speed", "gps_speed_ref", "gps_status", "gps_time_stamp", "gps_track", "gps_track_ref", "gps_version_id", "image_description", "image_length", "image_resources", "image_unique_id", "image_width", "inter_color_profile", "interoperability_ifd_pointer", "interoperability_index", "interoperability_version", "iptc_naa", "iso_speed_ratings", "jpeg_interchange_format", "jpeg_interchange_format_length", "jpeg_proc", "light_source", "make", "maker_note", "max_aperture_value", "metering_mode", "model", "new_cfa_pattern", "new_subfile_type", "oecf", "orientation", "padding", "photometric_interpretation", "pixel_x_dimension", "pixel_y_dimension", "planar_configuration", "primary_chromaticities", "print_image_matching", "reference_black_white", "related_image_file_format", "related_image_length", "related_image_width", "related_sound_file", "resolution_unit", "rows_per_strip", "samples_per_pixel", "saturation", "scene_capture_type", "scene_type", "sensing_method", "sharpness", "shutter_speed_value", "software", "spatial_frequency_response", "spectral_sensitivity", "strip_byte_counts", "strip_offsets", "sub_ifds", "sub_sec_time", "sub_sec_time_digitized", "sub_sec_time_original", "subject_area", "subject_distance", "subject_distance_range", "subject_location", "tiff_ep_standard_id", "time_zone_offset", "transfer_function", "transfer_range", "user_comment", "white_balance", "white_point", "x_resolution", "xml_packet", "xp_author", "xp_comment", "xp_keywords", "xp_subject", "xp_title", "y_resolution", "ycbcr_coefficients", "ycbcr_positioning", "ycbcr_sub_sampling"};
8
+
7
9
  void init_data();
8
10
 
9
11
  static VALUE rb_new(VALUE self, VALUE file_path);
@@ -12,5 +14,6 @@ static VALUE rb_value(VALUE self, VALUE key);
12
14
 
13
15
  static void each_content(ExifContent *ec, void *user_data);
14
16
  static void each_entry(ExifEntry *, void *user_data);
17
+ static char* attr_string(ExifIfd ifd, ExifTag tag);
15
18
 
16
19
  #endif /* DATA_H */
data/lib/exif.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'exif/version'
2
- require 'exif/underscore'
3
2
  require 'exif/exif'
4
3
 
5
4
  module Exif
data/lib/exif/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Exif
2
- VERSION = "0.9.0"
2
+ VERSION = "0.10.0"
3
3
  end
data/spec/exif_spec.rb CHANGED
@@ -10,13 +10,15 @@ describe Exif do
10
10
  # end
11
11
 
12
12
  it 'works' do
13
- expect(@data.contents[0][:image_width]).to eq 4000
14
- expect(@data.contents[:image_width]).to eq 4000
13
+ expect(@data.to_h[0][:image_width]).to eq 4000
14
+ expect(@data.to_h[:image_width]).to eq 4000
15
15
  expect(@data[0][:image_width]).to eq 4000
16
16
  expect(@data[:image_width]).to eq 4000
17
- expect(@data.contents[:gps][:gps_latitude]).to eq '24, 10.6817, 0'
18
- expect(@data.contents[:gps_latitude]).to eq '24, 10.6817, 0'
17
+ expect(@data.image_width).to eq 4000
18
+ expect(@data.to_h[:gps][:gps_latitude]).to eq '24, 10.6817, 0'
19
+ expect(@data.to_h[:gps_latitude]).to eq '24, 10.6817, 0'
19
20
  expect(@data[:gps][:gps_latitude]).to eq '24, 10.6817, 0'
20
21
  expect(@data[:gps_latitude]).to eq '24, 10.6817, 0'
22
+ expect(@data.gps_latitude).to eq '24, 10.6817, 0'
21
23
  end
22
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exif
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jian Weihang
@@ -66,6 +66,7 @@ files:
66
66
  - LICENSE.txt
67
67
  - README.md
68
68
  - Rakefile
69
+ - benchmark/benchmark.rb
69
70
  - exif.gemspec
70
71
  - ext/exif/data.c
71
72
  - ext/exif/data.h
@@ -73,7 +74,6 @@ files:
73
74
  - ext/exif/exif.h
74
75
  - ext/exif/extconf.rb
75
76
  - lib/exif.rb
76
- - lib/exif/underscore.rb
77
77
  - lib/exif/version.rb
78
78
  - spec/exif_spec.rb
79
79
  - spec/sample.jpg
@@ -1,12 +0,0 @@
1
- module Exif
2
- module_function
3
- def underscore!(word)
4
- word.to_s.gsub!('::', '/')
5
- word.gsub!(/(?:([A-Za-z\d])|^)((?=a)b)(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
6
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
7
- word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
8
- word.tr!("-", "_")
9
- word.downcase!
10
- word
11
- end
12
- end