Mercurial > geeqie
comparison src/exiv2.cc @ 178:9dc8bc9b2bb9
first exiv2 support that does not crash immediately
author | nadvornik |
---|---|
date | Wed, 13 Feb 2008 16:52:41 +0000 |
parents | |
children | 37004d5a584a |
comparison
equal
deleted
inserted
replaced
177:0ca3b4c8ffae | 178:9dc8bc9b2bb9 |
---|---|
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 */ |