8 #include <exiv2/image.hpp>
9 #include <exiv2/exif.hpp>
20 Exiv2::ExifData exifData;
21 Exiv2::ExifData::const_iterator iter;
25 ExifData *exif_read(gchar *path, gint parse_color_profile)
28 ExifData *exif = g_new0(ExifData, 1);
30 Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(path);
31 g_assert (image.get() != 0);
32 image->readMetadata();
33 exif->exifData = image->exifData();
36 catch (Exiv2::AnyError& e) {
37 std::cout << "Caught Exiv2 exception '" << e << "'\n";
43 void exif_free(ExifData *exif)
48 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
50 return g_strdup(exif->exifData[key].toString().c_str());
53 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
55 Exiv2::ExifKey ekey(key);
56 Exiv2::ExifData::iterator pos = exif->exifData.findKey(ekey);
57 if (pos == exif->exifData.end()) return 0;
58 *value = pos->getValue()->toLong();
63 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
65 /* Exiv2::Rational v = exif->exifData[key];
67 return exif->exifData[key];
71 double exif_rational_to_double(ExifRational *r, gint sign)
73 if (!r || r->den == 0.0) return 0.0;
75 if (sign) return (double)((int)r->num) / (double)((int)r->den);
76 return (double)r->num / r->den;
79 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
81 Exiv2::Exifdatum *item = &exif->exifData[key];
82 return (ExifItem *)item;
85 ExifItem *exif_get_first_item(ExifData *exif)
87 exif->iter = exif->exifData.begin();
88 if (exif->iter == exif->exifData.end()) return NULL;
89 const Exiv2::Exifdatum *item = &*exif->iter;
90 return (ExifItem *)item;
93 ExifItem *exif_get_next_item(ExifData *exif)
96 if (exif->iter == exif->exifData.end()) return NULL;
97 const Exiv2::Exifdatum *item = &*exif->iter;
98 return (ExifItem *)item;
101 const char *exif_item_get_tag_name(ExifItem *item)
103 return ((Exiv2::Exifdatum *)item)->key().c_str();
106 guint exif_item_get_tag_id(ExifItem *item)
108 return ((Exiv2::Exifdatum *)item)->tag();
111 guint exif_item_get_elements(ExifItem *item)
113 return ((Exiv2::Exifdatum *)item)->count();
116 char *exif_item_get_data(ExifItem *item, guint *data_len)
120 const char *exif_item_get_description(ExifItem *item)
122 return ((Exiv2::Exifdatum *)item)->tagLabel().c_str();
126 invalidTypeId, unsignedByte, asciiString, unsignedShort,
127 unsignedLong, unsignedRational, signedByte, undefined,
128 signedShort, signedLong, signedRational, string,
129 date, time, comment, directory,
130 xmpText, xmpAlt, xmpBag, xmpSeq,
133 EXIF_FORMAT_UNKNOWN = 0,
134 EXIF_FORMAT_BYTE_UNSIGNED = 1,
135 EXIF_FORMAT_STRING = 2,
136 EXIF_FORMAT_SHORT_UNSIGNED = 3,
137 EXIF_FORMAT_LONG_UNSIGNED = 4,
138 EXIF_FORMAT_RATIONAL_UNSIGNED = 5,
139 EXIF_FORMAT_BYTE = 6,
140 EXIF_FORMAT_UNDEFINED = 7,
141 EXIF_FORMAT_SHORT = 8,
142 EXIF_FORMAT_LONG = 9,
143 EXIF_FORMAT_RATIONAL = 10,
144 EXIF_FORMAT_FLOAT = 11,
145 EXIF_FORMAT_DOUBLE = 12
149 guint exif_item_get_format_id(ExifItem *item)
151 return ((Exiv2::Exifdatum *)item)->typeId();
153 const char *exif_item_get_format_name(ExifItem *item, gint brief)
155 return ((Exiv2::Exifdatum *)item)->typeName();
159 gchar *exif_item_get_data_as_text(ExifItem *item)
161 return g_strdup(((Exiv2::Exifdatum *)item)->toString().c_str());
165 gint exif_item_get_integer(ExifItem *item, gint *value)
169 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
173 const gchar *exif_get_description_by_key(const gchar *key)
177 gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
178 unsigned char *header_data, const guint header_len,
179 guint *image_offset, guint *exif_offset)