extexif 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.
data/ext/exif.rd.en ADDED
@@ -0,0 +1,146 @@
1
+ =begin
2
+
3
+ = ruby-libexif - an interface to libexif library
4
+
5
+ ((<libexif|URL:http://libexif.sourceforge.net>)) is the library for parsing image information contained in EXIF format images. ruby-libexif provides a simple interface to this library.
6
+
7
+ = Usage
8
+
9
+ require 'exif'
10
+
11
+ #
12
+ # generate Exif object from 'image.jpg' in the current directory.
13
+ #
14
+ exif = Exif.new('image.jpg')
15
+ #
16
+ # generate an empty Exif object, and load the image data into it.
17
+ #
18
+ exif = Exif.new
19
+ File.open('image.jpg') { |f| exif << f.read }
20
+
21
+
22
+ #
23
+ # To access the value of the tag, use Exif#[].
24
+ # The return value are string object.
25
+ # You can specify a tag by its name or title, or ID.
26
+ # For example, if you want to know the manufacturer of
27
+ # the recording equipment that generated the image,
28
+ # you can get the information by specifying the tag as follows:
29
+ #
30
+ # * exif['Manufacturer'] ; "tag title"
31
+ # * exif['Make'] ; "tag name"
32
+ # * exif[0x010f] ; "tag ID"
33
+ #
34
+ (Please refer ((<Exif.[]>)) , ((<Exif#[]>)) for more details, and ((<Exif#list_tags>)) for available tags in the IFD.)
35
+ # get a value of the specifid tag by its title
36
+ p exif["Manufacturer"] # -> "FUJIFILM"
37
+ # get a value of the specified tag by its tag ID (string)
38
+ p exif[0xa001] # -> "FUJIFILM"
39
+
40
+
41
+ #
42
+ # If the image has thumbnail, you can extract it by
43
+ # Exif#extract_thumbnail, or Exif#thumbnail
44
+ #
45
+
46
+ # extract a thumbnail, and save it to a file.
47
+ File.open('thumb.jpg', 'wb') {|dest| exif.thumbnail(dest)}
48
+ # set a new thumbnail to Exif object. note that existing
49
+ # thumbnail, if exists, will be destroyed.
50
+ File.open('src.jpg', 'rb'){|src| exif.thumbnail = src.read }
51
+
52
+ = Reference
53
+
54
+ == class Exif
55
+
56
+ === class methods
57
+
58
+ --- Exif.new
59
+
60
+ generate a new Exif object with empty data.
61
+
62
+ --- Exif.new(fpath)
63
+
64
+ load the image data from (({fpath})), and generates a new Exif object. If the image is not EXIF-formatted, exception ((<Exif::Error::NotExifFormat>)) raises.
65
+
66
+ --- Exif.[](tagid)
67
+
68
+ get a description of ((|tagid|)). the returned value is an array object:
69
+
70
+ ['tag title', ['tag name', 'description of the tag', 'tag ID']]
71
+
72
+ === instance methods
73
+
74
+ --- Exif#data=(str)
75
+ --- Exif#<<(str)
76
+
77
+ set the image data given as String object. The existing data in the object, if exists, will be destroyed.
78
+
79
+ --- Exif#list_tags(ifd)
80
+
81
+ return an array consists of tags defiend in IFD ((|ifd|)). each elements is following array object:
82
+
83
+ ["tag title", "tag ID('0xdddd')"]
84
+
85
+ ((|ifd|)) is one of the constants defined in ((<Exif::IFD>)).
86
+
87
+ --- Exif#byte_order
88
+
89
+ --- Exif#ifd
90
+
91
+ return a string that represents current IFD.
92
+
93
+ --- Exif#ifd=(ifd)
94
+
95
+ set IFD of the object to ((|ifd|)). ((|ifd|)) is one of the constants defined in ((<Exif::IFD>)), or either one of "0", "1", "GPS", "Interoperability". If invalid IFD is given, exception ((<Exif::Error::InvalidIFD>)) raises.
96
+
97
+ --- Exif#[](tag)
98
+
99
+ return the value (string) of the (({tag})). If the tag is not supported by current IFD, exception ((<Exif::Error::TagNotFound>)) raises. Unless you have set IFD by ((<Exif#ifd=>)), this method tries to find the tag and its value over available IFDs.
100
+
101
+ --- Exif#each_entry(use_tag_id=false) {|tag, val| ...}
102
+
103
+ executes the block, with the block arguments being tag title ((|tag|)) over the LFDs and its value ((|val|)). If ((|use_tag_id|)) is ((|true|)), ((|tag|)) is set to tag ID (denoted by '0xdddd').
104
+
105
+ --- Exif#extract_thumbnail(dest)
106
+ --- Exif#thumbnail(dest)
107
+
108
+ write the thumbnail of the image to ((|dest|)), using (({dest#<<})). If the image does not have thumbnail, exception ((<Exif::Error::ThumbnailNotFound>)) raises.
109
+
110
+ == modules
111
+
112
+ == Exif::IFD
113
+
114
+ IFDs defined in libexif.
115
+
116
+ --- Exif::IFD::Zero
117
+ --- Exif::IFD::One
118
+ --- Exif::IFD::EXIF
119
+ --- Exif::IFD::GPS
120
+ --- Exif::IFD::Interoperability
121
+ --- Exif::IFD::Any
122
+ This constant should be set in ((<Exif#ifd=>)) if ((<Exif#[]>)) searches tag over above five IFDs. Exif object is set to this value by default.
123
+
124
+ == Exif::ByteOrder
125
+
126
+ constants that represents byte order of the EXIF image.
127
+
128
+ --- Exif::ByteOrder::INTEL
129
+ --- Exif::ByteOrder::MOTOROLA
130
+
131
+ == Exception classes
132
+
133
+ RuntimeError --- Exif::Error -+- Exif::Error::NotExifFormat
134
+ |- Exif::Error::InvalidIFD
135
+ |- Exif::Error::ThumbnailNotFound
136
+ `- Exif::Error::TagNotFound
137
+ --- Exif::Error
138
+
139
+ Runtime errors occurred by using ruby-libexif belong to this class, or following derived classes.
140
+
141
+ --- Exif::Error::NotExifFormat
142
+ --- Exif::Error::InvalidIFD
143
+ --- Exif::Error::TagNotFound
144
+ --- Exif::Error::ThumbnailNotFound
145
+
146
+ =end
data/ext/exif.rd.ja ADDED
@@ -0,0 +1,154 @@
1
+ =begin
2
+
3
+ = ruby-libexif - libexif �� ruby ����Ȥ�����Υ饤�֥�ꡣ
4
+
5
+ libexif��EXIF�ե����ޥåȤΥ��᡼�����饿���������Ф��뤿���C�饤�֥��Ǥ����ܥ饤�֥���(({exif(1)}))��Ʊ���ε�ǽ��ruby�����ڤ˰������Ȥ���Ū�Ȥ��Ƥ��ޤ���
6
+
7
+ libexif, exif�ˤĤ��Ƥϡ�((<URL:http://libexif.sourceforge.net>))�򻲾Ȥ��Ʋ�������
8
+
9
+ = �Ȥ���
10
+
11
+ require 'exif'
12
+
13
+ # �����ȥǥ��쥯�ȥ��image.jpg����Exif���֥������Ȥ��������롣
14
+ exif = Exif.new('image.jpg')
15
+ # Exif���֥������Ȥ����������ǡ�����Ϳ���롣
16
+ exif = Exif.new
17
+ File.open('image.jpg') { |f| exif << f.read }
18
+
19
+ # �����Υ����ȥ���Ѥ����ͤ����롣
20
+ p exif["Manufacturer"] # -> "FUJIFILM"
21
+ # ������ID���Ѥ����ͤ����롣
22
+ p exif['0xa001'] # -> "FUJIFILM"
23
+ #
24
+ # ���ߤΤȤ������֤��ͤ�ʸ���󥪥֥������Ȥ����줵��Ƥ��ޤ���
25
+ # �ޤ��������Ȥ��ơ�����3�Ĥ�ɽ����Ϳ���뤳�Ȥ��Ǥ��ޤ���
26
+ # exif["Manufacturer"] ; �����Υ����ȥ�
27
+ # exif["Make"] ; ������EXIF-2.1�ǵ��ꤵ�줿̾��
28
+ # exif[0xa001] ; ������ID��16��ɽ������ʸ����
29
+ # IFD�ˤ�äƵ��ꤵ��Ƥ��륿���μ���ϰۤʤ�ޤ�����
30
+ # (({Exif#ifd=}))�ˤ�ä�����Ū��IFD����ꤷ�ʤ��¤ꡢ���Ƥ�IFD���оݤˤ���
31
+ # ������õ���Ф����б������ͤ��֤����Ȥ��ޤ�������Ū��IFD����ꤷ���塢
32
+ # ���Τ褦��ư����ᤷ�����Ȥ��ϡ�(({Exif#ifd=}))�ΰ�����
33
+ # (({Exif::IFD::Any}))(����Ū���Ѱդ����⥸�塼�����)����ꤷ�Ʋ�������
34
+ #
35
+ # �����ξܺ٤ˤĤ��Ƥϡ�(({Exif.[]}))���Ѥ���Ĵ�٤뤳�Ȥ��Ǥ��ޤ���
36
+ # �ޤ�������IFD�ˤ��������Ѳ�ǽ�ʥ����ˤĤ��Ƥ�(({Exif#list_tags}))��
37
+ # �Ѥ���Ĵ�٤뤳�Ȥ��Ǥ��ޤ���)
38
+
39
+ # ����ͥ������Ф����ե��������¸���롣
40
+ File.open('thumb.jpg', 'wb') {|dest| exif.thumbnail(dest)}
41
+ # ����ͥ�������ꤹ�롣����¸�ߤ��륵��ͥ�����˴�����롣
42
+ File.open('src.jpg', 'rb'){|src| exif.thumbnail = src.read }
43
+
44
+ = ��ե����
45
+
46
+ == class Exif
47
+
48
+ === ���饹�᥽�å�
49
+
50
+ --- Exif.new
51
+
52
+ ���᡼���ǡ���������Exif���֥������Ȥ��������ޤ���
53
+
54
+ --- Exif.new(fpath)
55
+
56
+ (({fpath}))�ǻ��ꤵ��륤�᡼�����ɤߡ�Exif���֥������Ȥ��������ޤ������᡼����EXIF�ե����ޥåȤǤϤʤ���硢�㳰((<Exif::Error::NotExifFormat>))��ȯ�����ޤ���
57
+
58
+ --- Exif.[](tagid)
59
+
60
+ ʸ���󤫿��ͤǻ��ꤵ���((|tagid|))�˴ؤ������������ޤ����֤��ͤ�
61
+
62
+ ['�����Υ����ȥ�', ['������̾��', '����������', '����ID(����)']]
63
+
64
+ �Ǥ���
65
+
66
+
67
+ === �᥽�å�
68
+
69
+ --- Exif#load(fpath)
70
+
71
+ --- Exif#data=(str)
72
+ --- Exif#<<(str)
73
+
74
+ ruby��String���֥������Ȥ�Ϳ����줿�ǡ����򿷤��˥��åȤ��ޤ������Ǥ˥ǡ��������åȤ���Ƥ������ˤϡ�������˴�����ޤ���
75
+
76
+ --- Exif#list_tags(ifd)
77
+
78
+ IFD ((|ifd|)) ���������Ƥ��륿���Υꥹ�Ȥ�������֤��ޤ��������Ǥ�
79
+
80
+ ["�����Υ����ȥ�", "����ID('0xdddd')"]
81
+
82
+ �Ȥ�������Ǥ���((|ifd|))�ˤ�((<Exif::IFD>))�ʲ�����������������Ѥ��Ʋ�������
83
+
84
+ --- Exif#byte_order
85
+
86
+ ���᡼���ΥХ��ȥ����������֤��ޤ����֤��ͤ�((<Exif::ByteOrder>))����������������ͤǤ���
87
+
88
+ --- Exif#ifd
89
+
90
+ ���ߤ�IFD(Image File Directory)��ʸ������֤��ޤ���
91
+
92
+ --- Exif#ifd=(ifd)
93
+
94
+ IFD(Image File Directory)�����ꤷ�ޤ���((|ifd|))��((<Exif::IFD>))�ʲ�����������������Ѥ��Ʋ�������
95
+
96
+ --- Exif#[](tag)
97
+
98
+ ���Ƥ�IFD���Ϥä�Ϳ����줿����(({tag}))��Ĵ�١�������б������ͤ�ʸ������֤��ޤ�����������((<Exif#ifd=>))������Ū��IFD����ꤷ����ϡ�����IFD�ˤ����ƥ������������Ƥ���С��б������ͤ��֤��ޤ����������Ƥ��ʤ����ˤϡ��㳰((<Exif::Error::TagNotFound>))��ȯ�����ޤ������ư����ᤷ�������ϡ�((<Exif#ifd=>))��((<Exif::IFD::Any>))����ꤷ�Ʋ�������
99
+
100
+ --- Exif#each_entry(use_tag_id=false) {|tag, value| ...}
101
+
102
+ ���᡼���˴ޤޤ�륿���Υ����ȥ��(({tag}))���ͤ�(({tag}))�Ȥ��ơ��֥��å���¹Ԥ��ޤ���((|use_tag_id|))��(({true}))�ΤȤ���(({tag}))�ˤϥ�����ID('0xdddd'ɽ��)����������ޤ���
103
+
104
+ --- Exif#extract_thumbnail(dest)
105
+ --- Exif#thumbnail(dest)
106
+
107
+ ���᡼���˴ޤޤ�륵��ͥ����((|dest|))��(({dest#<<}))���Ѥ��ƽ񤭤��ߤޤ���
108
+
109
+ == �⥸�塼��
110
+
111
+ == Exif::IFD
112
+
113
+ IFD�μ����ɽ�����
114
+
115
+ --- Exif::IFD::Zero
116
+ --- Exif::IFD::One
117
+ --- Exif::IFD::EXIF
118
+ --- Exif::IFD::GPS
119
+ --- Exif::IFD::Interoperability
120
+ --- Exif::IFD::Any
121
+
122
+ == Exif::ByteOrder
123
+
124
+ EXIF���᡼���ΥХ��ȥ���������ɽ�����
125
+
126
+ --- Exif::ByteOrder::INTEL
127
+ --- Exif::ByteOrder::MOTOROLA
128
+
129
+ == �㳰���饹
130
+
131
+ RuntimeError --- Exif::Error -+- Exif::Error::NotExifFormat
132
+ |- Exif::Error::InvalidIFD
133
+ `- Exif::Error::TagNotFound
134
+ --- Exif::Error
135
+
136
+ ruby-libexif�������㳰�����Ƥ����㳰�����ޤ��ϰʲ��Υ��֥��饹���㳰��°���ޤ���
137
+
138
+ --- Exif::Error::ExifFormat
139
+
140
+ Ϳ����줿���᡼����EXIF�ե����ޥåȤ�Ŭ�礷�Ƥ��ʤ���硢�����㳰��ȯ�����ޤ���
141
+
142
+ --- Exif::Error::InvalidIFD
143
+
144
+ ((<Exif#ifd=>))�ǡ�������IFD����ꤷ�����ˡ������㳰��ȯ�����ޤ���
145
+
146
+ --- Exif::Error::TagNotFound
147
+
148
+ ((<Exif#[]>))�ǡ�Tag�����ߤ�IFD�Ǹ��Ĥ���ʤ��ä����ˡ������㳰��ȯ�����ޤ���
149
+
150
+ --- Exif::Error::ThumbnailNotFound
151
+
152
+ ((<Exif#thumbnail>))�ǡ����᡼���˥���ͥ��뤬�ޤޤ�ʤ����ˡ������㳰��ȯ�����ޤ���
153
+
154
+ =end
data/ext/extconf.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'mkmf'
2
+
3
+ dir_config("exif", "/usr/local/include", "/usr/local/lib")
4
+
5
+ def have_libexif_header
6
+ have_header('libexif/exif-ifd.h') and
7
+ have_header('libexif/exif-data.h') and
8
+ have_header('libexif/exif-utils.h') and
9
+ have_header('libexif/exif-tag.h')
10
+ end
11
+
12
+ if have_libexif_header and have_library("exif")
13
+ create_makefile("exif")
14
+ end
15
+
data/lib/extexif.rb ADDED
@@ -0,0 +1,135 @@
1
+ # An ExtExif is to use EXIF data from Ruby.
2
+ # This class is ruby-libexif wrapper, and you can access to Exif field with EXIF tag name of Tag ID.
3
+ #
4
+ # EXIF Tags:
5
+ # * English - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
6
+ # * Japanese - http://cachu.xrea.jp/perl/ExifTAG.html
7
+ #
8
+ # == Examples
9
+ # require 'extexif'
10
+ #
11
+ # images = ExtExif.new('sample.jpg')
12
+ # images.attribute("GPSLongitude") # => "139.00, 41.00, 17.19"
13
+ # images["GPSLongitude"] # => "139.00, 41.00, 17.19" - This is synonim.
14
+ # images.attribute("GPSLatitude") # => "35.00, 39.00, 45.38"
15
+ # images["GPSLatitude"] # => "35.00, 39.00, 45.38"
16
+ #
17
+ require 'exif.so'
18
+ class ExtExif
19
+ VERSION = '1.0.0'
20
+
21
+ # Exif data
22
+ # {{{
23
+ TAGID = {"DNGColorMatrix1"=>50721, "EXFilter"=>3312311, "OLZoom"=>3104109, "MLTFolderName"=>3700003, "DNGColorMatrix2"=>50722,
24
+ "CNLensMinimum"=>4000001, "PXOTimeZone"=>3404096, "PXOCaptureMode"=>3400001, "Artist"=>315, "CNDigitalZoom"=>4000001,
25
+ "OLSharpnessFactor"=>3104138, "DigitalZoomRatio"=>41988, "LightSource"=>37384, "MLTDate"=>3700003, "SubjectDistanceRange"=>41996,
26
+ "TransferFunction"=>301, "SGJpegQuality"=>3800022, "DNGMakerNoteSafety"=>50741, "InteroperabilityIndex"=>2000000, "MLTAperture"=>3700003,
27
+ "MLTThumbnail"=>3700129, "SGSharpness"=>3800017, "NKColorMode"=>3500003, "MLTLensID"=>3700268, "MLTColorMode"=>3700003,
28
+ "MLTFileNumberMemory"=>3700003, "EXObjectDistance"=>3308226, "PXOISOSpeed"=>3400020, "FNumber"=>33437, "CompressedBitsPerPixel"=>37122,
29
+ "Compression"=>259, "GPSDestDistanceRef"=>1000025, "NKAdapter"=>3500130, "NKEColorMode"=>3600004, "GPSTrack"=>1000015, "ImageWidth"=>256,
30
+ "ShutterSpeedValue"=>37377, "MLTSpotFocusPointX"=>3700003, "PXOContrast"=>3400012, "NKLendID"=>3500152, "MLTSpotFocusPointY"=>3700003,
31
+ "Saturation"=>41993, "NKManualFocusDistance"=>3500133, "CNLensID"=>4000001, "Contrast"=>41992, "OLExposureBias"=>3104102, "OLSpecialMode"=>3100512,
32
+ "DNGBlackLevel"=>50714, "DNGPrivateData"=>50740, "EXCCDSensitivity"=>3312308, "RowsPerStrip"=>278, "SubSecTimeDegitized"=>37522,
33
+ "NKColorOffset"=>3500146, "DNGCameraCalibration1"=>50723, "PXOWhiteBalance"=>3400007, "BitsPerSample"=>258, "MLTMeteringMode"=>3700003,
34
+ "DNGCameraCalibration2"=>50724, "CNNDFilter"=>4000004, "CNWhitebalance"=>4000004, "YCbCrSubSampling"=>530, "SubSecTimeOriginal"=>37521,
35
+ "MLTIntervalNumber"=>3700003, "0xa500"=>42240, "GPSDestBearingRef"=>1000023, "DNGBaselineNoise"=>50731, "CNSharpness"=>4000001, "GPSMapDatum"=>1000018,
36
+ "OLFlashMode"=>3104100, "DNGAsShotNeutral"=>50728, "NKWhitebalance"=>3500005, "OLWhiteBalance"=>3104117, "FJMacro"=>4604128, "PXOSharpness"=>3400011,
37
+ "CNMacroMode"=>4000001, "MLTFlashFired"=>3700003, "DateTimeOriginal"=>36867, "FocalPlaneResolutionUnit"=>41488, "EXContrast"=>3300032,
38
+ "SpectralSensitivity"=>34852, "EXTimeZone"=>3312294, "EXThumbnail"=>3308192, "CNImageEffect"=>4000001, "DNGReductionMatrix1"=>50725, "CNFirmware"=>4000007,
39
+ "CNExposure"=>4000004, "CRSChromaticAberrationB"=>3000022, "DNGReductionMatrix2"=>50726, "GPSDestDistance"=>1000026, "CRSTint"=>3000005, "EXColorMode"=>3312309,
40
+ "FocalPlaneXResolution"=>41486, "CNAFStopButton"=>4000015, "SubjectLocation"=>41492, "NKColorSpace"=>3500141, "FJFocusMode"=>4604129, "FJQuality"=>4604096,
41
+ "CNAFPointUsed"=>4000004, "CNFlashDetailed"=>4000001, "MLTBWFilter"=>3700003, "NKWhiteBalanceOffset"=>3500011, "FileSource"=>41728, "DNGShadowScale"=>50739,
42
+ "MLTIntervalLength"=>3700003, "MLTWhiteBalance"=>3700003, "NKNoiseReduction"=>3500149, "ImageDescription"=>270, "PXFNumber"=>3200019,
43
+ "SGExposureMode"=>3800008, "PXLensID"=>3200063, "NKShotCount"=>3500167, "CNAFSupliment"=>4000015, "YResolution"=>283,
44
+ "DNGCalibrationIlluminant1"=>50778, "0xa420"=>42016, "MLTFilmSpeed"=>3700003, "Make"=>271, "DNGCalibrationIlluminant2"=>50779,
45
+ "NKAFFocusPoint"=>3500136, "FJColor"=>4604099, "OLDigitalZoom"=>3100516, "YCbCrPositioning"=>531, "MLTColorFilter"=>3700003, "WhitePoint"=>318,
46
+ "PXODaylightSavings"=>3404097, "YCbCrCoefficients"=>529, "NKSharpness"=>3500006, "EXColorEnhance"=>3312310, "GPSAltitudeRef"=>5,
47
+ "FJVersion"=>4600000, "GPSSpeed"=>1000013, "SubjectArea"=>37396, "DNGRawDataUniqueID"=>50781, "OLMacro"=>3100514, "GPSImgDirection"=>1000017,
48
+ "ExposureMode"=>41986, "CRSLuminanceSmoothing"=>3000016, "SGColorCoordination"=>3800020, "CNFlash"=>4000001, "ModifyDate"=>306,
49
+ "EXFlash"=>3308210, "EXSelfTimer"=>3312289, "CNFocusMode"=>4000001, "ResolutionUnit"=>296, "MLTShutterSpeed"=>3700003, "DNGAsShotICCProfile"=>50831,
50
+ "CNFocusSetting"=>4000001, "CRSBlueSaturation"=>3000014, "CRSAutoExposure"=>3000029, "CRSChromaticAberrationR"=>3000021, "CustomRendered"=>41985,
51
+ "ExifVersion"=>36864, "CRSBrightness"=>3000009, "EXQuality"=>3312290, "FocalLength"=>37386, "ExposureProgram"=>34850, "DNGChromaBlurRadius"=>50737,
52
+ "MLTContrast"=>3700003, "DNGActiveArea"=>50829, "NKLensSetting"=>3500131, "GPSLatitude"=>2, "SGAFMode"=>3800005, "ColorSpace"=>40961,
53
+ "FocalLengthIn35mmFilm"=>41989, "NKEWhiteBalance"=>3600007, "SubSecTime"=>37520, "DeviceSettingDescription"=>41995, "SceneType"=>41729,
54
+ "CRSVignetteAmount"=>3000023, "GPSSpeedRef"=>1000012, "EXSaturation"=>3300031, "NKContrastSetting"=>3500129, "GPSImgDirectionRef"=>1000016,
55
+ "EXRecordMode"=>3312288, "FJAEWarning"=>4604866, "CNShutterStep"=>4000015, "MLTFocusArea"=>3700003, "SGShadow"=>3800014, "MLTSharpness"=>3700003,
56
+ "FJSlowSync"=>4604144, "CNFlashMemLimit"=>4000015, "CNSerial"=>4000012, "CRSRedHue"=>3000017, "ApertureValue"=>37378, "DNGOriginalRawFileData"=>50828,
57
+ "MLTMacroMode"=>3700003, "CRSTemperature"=>3000004, "FJFlashMode"=>4604112, "CRSLens"=>3000024, "CFAPattern"=>41730, "SGFocalLength"=>3800010,
58
+ "OLMacroFocus"=>3104110, "MLTWhiteBalanceRed"=>3700003, "NKEDigitalZoom"=>3600010, "DNGVersion"=>50706, "SGFocusMode"=>3800006, "CNFocusType"=>4000001,
59
+ "CRSExposure"=>3000007, "EXWhiteBalance"=>3300025, "PXExposureBias"=>3200022, "InteroperabilityIFDPointer"=>40965, "ReferenceBlackWhite"=>532,
60
+ "Model"=>272, "JPEGInterchangeFormat"=>513, "MLTThumbnailOffset"=>3700136, "SGSoftware"=>3800024, "CNImageType"=>4000006, "RelatedSoundFile"=>40964,
61
+ "PXODigitalZoom"=>3400010, "DNGBestQualityScale"=>50780, "DNGAnalogBalance"=>50727, "MLTMakerNoteVersion"=>3700000, "GPSDestBearing"=>1000024,
62
+ "SGSaturation"=>3800016, "PXOFocusMode"=>3400003, "MLTLastFileNumber"=>3700003, "PixelYDimension"=>40963, "SGImageSize"=>3800004,
63
+ "GPSDestLongitude"=>1000022, "Flash"=>37385, "DNGBackwardVersion"=>50707, "OLBlueBias"=>3104120, "PlanarConfiguration"=>284, "NKQuality"=>3500004,
64
+ "ExposureBiasValue"=>37380, "DNGBayerGreenSplit"=>50733, "GPSMessureMode"=>1000010, "GPSDateStamp"=>1000029, "SamplesPerPixel"=>277,
65
+ "DNGAsShotWhiteXY"=>50729, "PrimaryChromaticities"=>319, "CNAperture"=>4000004, "PXWhiteBalance"=>3200025, "CRSSharpness"=>3000015,
66
+ "SGFirmware"=>3800023, "PixelXDimension"=>40962, "GPSProcessingMethod"=>1000027, "GPSTrackRef"=>1000014, "FJBlurWarning"=>4604864,
67
+ "FJWhiteBalance"=>4604098, "GPSAreaInformation"=>1000028, "OLFocusDistance"=>3104108, "MLTDECPosition"=>3700003, "CRSSaturation"=>3000011,
68
+ "OLColourMatrix"=>3130, "OLSharpness"=>3104111, "OLRedBias"=>3104119, "NKFlashMode"=>3500009, "MLTunknown16"=>3700003, "SensingMethod"=>41495,
69
+ "MLTFocalLength"=>3700003, "MLTCameraSettings"=>3703840, "CRSAutoContrast"=>3000028, "EXPIM"=>3303584, "PXISOSpeed"=>3200020, "CRSRawFileName"=>3000001,
70
+ "CNNoiseReduction"=>4000015, "MLTPIMInformation"=>3703584, "OLImageWidth"=>3104142, "SGWhiteBalance"=>3800007, "CNColorTemp"=>4000160,
71
+ "CNApexPriority"=>4000015, "SGX3FillLight"=>3800018, "CNSelfTimer"=>4000001, "Orientation"=>274, "MLTFocusMode"=>3700003,
72
+ "MLTExposureMode"=>3700003, "OLValidBits"=>3104140, "KCMode"=>9900001, "MLTComppressImageSize"=>3700064, "StripByteCounts"=>279,
73
+ "DNGCameraSerialNumber"=>50735, "PXOColorMode"=>3400023, "MakerNote"=>37500, "DNGAsShotPreProfileMatrix"=>50832, "CNUser"=>4000009,
74
+ "CRSColorNoiseReduction"=>3000020, "NKEImageAdjustment"=>3600005, "CNImageNumber"=>4000004, "DNGCFALayout"=>50711, "GPSLongitudeRef"=>3,
75
+ "NKLensInfo"=>3500132, "CRSWhiteBalance"=>3000003, "CNImageSelect"=>4000001, "XResolution"=>282, "DNGLensInfo"=>50736, "WhiteBalance"=>41987,
76
+ "MLTImageSize"=>3700003, "MeteringMode"=>37383, "MLTMaxAperture"=>3700003, "NKEFocus"=>3600008, "MLTBrightnessValue"=>3700003,
77
+ "NKDigitalImgProg"=>3500171, "CNColorSpace"=>4000180, "CRSContrast"=>3000010, "DNGLinearizationTable"=>50712, "NKFinishSetting"=>3500169,
78
+ "MLTExposureCompensation"=>3700003, "GPSLatitudeRef"=>1, "FJFlashStrength"=>4604113, "DNGDefaultCropOrigin"=>50719, "GPSDestLatitudeRef"=>1000019,
79
+ "CRSGreenSaturation"=>3000013, "UserComment"=>37510, "MLTFlashMode"=>3700003, "NKISOselection"=>3500015, "Sharpness"=>41994,
80
+ "DNGAntiAliasStrength"=>50738, "SGCustomSettingMode"=>3800021, "OLCameraID"=>3100521, "OLContrast"=>3104137, "DNGDefaultCropSize"=>50720,
81
+ "DNGLinearResponseLimit"=>50734, "CNAFPoint"=>4000001, "DNGBaselineExposure"=>50730, "ISOSpeedRatings"=>34855, "CNButtunFunction"=>4000015,
82
+ "DNGCurrentICCProfile"=>50833, "CRSAutoBrightness"=>3000026, "MLTImageQuality"=>3700003, "DNGOriginalRawFileName"=>50827,
83
+ "PhotometricInterpretation"=>262, "CRSBlueHue"=>3000019, "GPSDOP"=>1000011, "MLTSaturation"=>3700003, "FJContBlacket"=>4604352,
84
+ "SGSerialID"=>3800002, "CRSShadowTint"=>3000006, "DNGBaselineSharpness"=>50732, "EXFocusMode"=>3312291, "CRSGreenHue"=>3000018,
85
+ "OLSerialNumber"=>3104122, "MLTISOSetting"=>3700003, "MetadataDate"=>36868, "MLTDigitalZoom"=>3700003, "MLTWideFocusZone"=>3700003,
86
+ "GPSStatus"=>9, "GPSLongitude"=>4, "FJPictureMode"=>4604145, "EXISOSensitivity"=>3300020, "EXImageSize"=>3300009,
87
+ "CNFlashBias"=>4000004, "MLTDriveMode"=>3700003, "MaxApertureValue"=>37381, "ExposureTime"=>33434, "GainControl"=>41991, "MLTInternalFlash"=>3700003,
88
+ "SGHighlight"=>3800015, "OLSoftwareRelease"=>3100519, "CNLensMaximum"=>4000001, "PXOQualityLevel"=>3400002, "MLTFocusDistance"=>3700003,
89
+ "FJSharpness"=>4604097, "DNGBlackLevelRepeatDim"=>50713, "PXOSaturation"=>3400013, "SGContrast"=>3800013, "DNGUniqueCameraModel"=>50708,
90
+ "GPSAltitude"=>6, "BrightnessValue"=>37379, "CNMirrorLockUp"=>4000015, "SpatialFrequencyResponse"=>41484, "MLTThumbnailLength"=>3700137,
91
+ "CNMenuPosition"=>4000015, "NKISOSetting"=>3500002, "OLFocusMode"=>3104107, "ComponentsConfiguration"=>37121, "OLCoringFilter"=>3104141}
92
+ # }}}
93
+
94
+ attr_accessor :image
95
+
96
+ class ExifError < StandardError #:nodoc:
97
+ end
98
+ class FileNotFoundError < ExifError #:nodoc:
99
+ end
100
+
101
+ # Create new EXIF image instance.
102
+ # If file is dont't exist when throw ExtExif::FileNotFounedError.
103
+ #
104
+ # Parameters:
105
+ # * path - Path for image file.
106
+ def initialize(path)
107
+ raise FileNotFound, "#{path} not found." unless File.exists?(path)
108
+ @image = Exif.new(path)
109
+ end
110
+
111
+ # Grub the EXIF data.
112
+ # if Exif data is empty when return nil.
113
+ #
114
+ # Parameters:
115
+ # * name_or_id - EXIF Tag name or EXIF Tag id
116
+ #
117
+ # == Examples
118
+ # images = ExtExif.new('sample.jpg')
119
+ # images.attribute("GPSLongitude") # => 139.00, 41.00, 17.19
120
+ # images["GPSLongitude"] # => 139.00, 41.00, 17.19, - This is synonim.
121
+ # images.attribute("GPSLatitude") # =>
122
+ # images["GPSLongitude"] # =>
123
+ #
124
+ def attribute(name_or_id)
125
+ tagid = name_or_id.kind_of?(Numeric)? name_or_id : TAGID[name_or_id]
126
+ tagid.nil? ? nil : @image[tagid]
127
+ end
128
+ alias :[] :attribute
129
+
130
+ # Proxy to Exif object
131
+ def method_missing(name, *args, &block)
132
+ @image.send(name, *args, &block)
133
+ end
134
+ end
135
+