178
|
1
|
|
2 #ifdef HAVE_CONFIG_H
|
|
3 # include "config.h"
|
|
4 #endif
|
|
5
|
|
6 #ifdef HAVE_EXIV2
|
|
7
|
|
8 #include <exiv2/image.hpp>
|
|
9 #include <exiv2/exif.hpp>
|
|
10 #include <iostream>
|
|
11
|
|
12 extern "C" {
|
|
13
|
|
14 #include <glib.h>
|
|
15 #include "exif.h"
|
|
16
|
|
17
|
|
18 struct _ExifData
|
|
19 {
|
|
20 Exiv2::ExifData exifData;
|
|
21 Exiv2::ExifData::const_iterator iter;
|
|
22 };
|
|
23
|
|
24
|
|
25 ExifData *exif_read(gchar *path, gint parse_color_profile)
|
|
26 {
|
|
27 try {
|
|
28 ExifData *exif = g_new0(ExifData, 1);
|
|
29
|
|
30 Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path);
|
|
31 g_assert (image.get() != 0);
|
|
32 image->readMetadata();
|
|
33 exif->exifData = image->exifData();
|
|
34 }
|
|
35 catch (Exiv2::AnyError& e) {
|
|
36 std::cout << "Caught Exiv2 exception '" << e << "'\n";
|
|
37 }
|
|
38 }
|
|
39
|
|
40 void exif_free(ExifData *exif)
|
|
41 {
|
|
42 }
|
|
43
|
|
44
|
|
45 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
|
|
46 {
|
|
47 return g_strdup(exif->exifData[key].toString().c_str());
|
|
48 }
|
|
49
|
|
50 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
|
|
51 {
|
|
52 return exif->exifData[key].toLong();
|
|
53 }
|
|
54
|
|
55 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
|
|
56 {
|
|
57 /* Exiv2::Rational v = exif->exifData[key];
|
|
58 ExifRational *ret =
|
|
59 return exif->exifData[key];
|
|
60 */
|
|
61 }
|
|
62
|
|
63 double exif_rational_to_double(ExifRational *r, gint sign)
|
|
64 {
|
|
65 if (!r || r->den == 0.0) return 0.0;
|
|
66
|
|
67 if (sign) return (double)((int)r->num) / (double)((int)r->den);
|
|
68 return (double)r->num / r->den;
|
|
69 }
|
|
70
|
|
71 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
|
|
72 {
|
|
73 Exiv2::Exifdatum *item = &exif->exifData[key];
|
|
74 return (ExifItem *)item;
|
|
75 }
|
|
76
|
|
77 ExifItem *exif_get_first_item(ExifData *exif)
|
|
78 {
|
|
79 exif->iter = exif->exifData.begin();
|
|
80 if (exif->iter == exif->exifData.end()) return NULL;
|
|
81 const Exiv2::Exifdatum *item = &*exif->iter;
|
|
82 return (ExifItem *)item;
|
|
83 }
|
|
84
|
|
85 ExifItem *exif_get_next_item(ExifData *exif)
|
|
86 {
|
|
87 exif->iter++;
|
|
88 if (exif->iter == exif->exifData.end()) return NULL;
|
|
89 const Exiv2::Exifdatum *item = &*exif->iter;
|
|
90 return (ExifItem *)item;
|
|
91 }
|
|
92
|
|
93 const char *exif_item_get_tag_name(ExifItem *item)
|
|
94 {
|
|
95 return ((Exiv2::Exifdatum *)item)->tagName().c_str();
|
|
96 }
|
|
97
|
|
98 guint exif_item_get_tag_id(ExifItem *item)
|
|
99 {
|
|
100 return ((Exiv2::Exifdatum *)item)->idx();
|
|
101 }
|
|
102
|
|
103 guint exif_item_get_elements(ExifItem *item)
|
|
104 {
|
|
105 return ((Exiv2::Exifdatum *)item)->count();
|
|
106 }
|
|
107
|
|
108 char *exif_item_get_data(ExifItem *item, guint *data_len)
|
|
109 {
|
|
110 }
|
|
111
|
|
112 const char *exif_item_get_description(ExifItem *item)
|
|
113 {
|
|
114 return ((Exiv2::Exifdatum *)item)->tagLabel().c_str();
|
|
115 }
|
|
116
|
|
117 /*
|
|
118 invalidTypeId, unsignedByte, asciiString, unsignedShort,
|
|
119 unsignedLong, unsignedRational, signedByte, undefined,
|
|
120 signedShort, signedLong, signedRational, string,
|
|
121 date, time, comment, directory,
|
|
122 xmpText, xmpAlt, xmpBag, xmpSeq,
|
|
123 langAlt, lastTypeId
|
|
124
|
|
125 EXIF_FORMAT_UNKNOWN = 0,
|
|
126 EXIF_FORMAT_BYTE_UNSIGNED = 1,
|
|
127 EXIF_FORMAT_STRING = 2,
|
|
128 EXIF_FORMAT_SHORT_UNSIGNED = 3,
|
|
129 EXIF_FORMAT_LONG_UNSIGNED = 4,
|
|
130 EXIF_FORMAT_RATIONAL_UNSIGNED = 5,
|
|
131 EXIF_FORMAT_BYTE = 6,
|
|
132 EXIF_FORMAT_UNDEFINED = 7,
|
|
133 EXIF_FORMAT_SHORT = 8,
|
|
134 EXIF_FORMAT_LONG = 9,
|
|
135 EXIF_FORMAT_RATIONAL = 10,
|
|
136 EXIF_FORMAT_FLOAT = 11,
|
|
137 EXIF_FORMAT_DOUBLE = 12
|
|
138 */
|
|
139
|
|
140
|
|
141 guint exif_item_get_format_id(ExifItem *item)
|
|
142 {
|
|
143 return ((Exiv2::Exifdatum *)item)->typeId();
|
|
144 }
|
|
145 const char *exif_item_get_format_name(ExifItem *item, gint brief)
|
|
146 {
|
|
147 /*
|
|
148 return exif_item_get_tag_name(item);
|
|
149 */
|
|
150 }
|
|
151
|
|
152
|
|
153 gchar *exif_item_get_data_as_text(ExifItem *item)
|
|
154 {
|
|
155 return g_strdup(((Exiv2::Exifdatum *)item)->toString().c_str());
|
|
156 }
|
|
157
|
|
158
|
|
159 gint exif_item_get_integer(ExifItem *item, gint *value)
|
|
160 {
|
|
161 }
|
|
162
|
|
163 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
|
|
164 {
|
|
165 }
|
|
166
|
|
167 const gchar *exif_get_description_by_key(const gchar *key)
|
|
168 {
|
|
169 }
|
|
170
|
|
171 gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
|
|
172 unsigned char *header_data, const guint header_len,
|
|
173 guint *image_offset, guint *exif_offset)
|
|
174 {
|
|
175 return 0;
|
|
176 }
|
|
177
|
|
178 }
|
|
179
|
|
180 #endif
|
|
181 /* HAVE_EXIV2 */
|