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 */