From 9024ebb192d2ecdd2305a3ff3fbb54481035bd08 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Thu, 27 Dec 2012 20:31:26 +0100 Subject: Add support for EXIF Canon Camera temperature For the moment we're using Exif.CanonSi.0x000c key from Exiv2 namespace since it's an unknown tag to it. This may need little tweaking in the future when proper naming becomes upstream. --- src/jpeg-utils.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/jpeg-utils.h | 1 + 2 files changed, 41 insertions(+) (limited to 'src') diff --git a/src/jpeg-utils.cpp b/src/jpeg-utils.cpp index 389b8e4..196752a 100644 --- a/src/jpeg-utils.cpp +++ b/src/jpeg-utils.cpp @@ -69,6 +69,25 @@ exif_data_free (ExifData *data) } } +static const gchar * +get_real_key_name (const gchar *key) +{ + struct StrKeyPair { + const gchar *from; + const gchar *to; + }; + static const struct StrKeyPair conv[] = { + { EXIF_CANON_CAMERA_TEMP, "Exif.CanonSi.0x000c" }, + }; + + guint i; + + for (i = 0; i < G_N_ELEMENTS (conv); i++) + if (g_str_equal (conv[i].from, key)) + return conv[i].to; + + return key; +} /* * Retrieves value of the specified key or NULL if the key does not exist. @@ -77,6 +96,11 @@ exif_data_free (ExifData *data) gchar * get_exif_data (ExifData *exif, const gchar *key) { + g_return_val_if_fail (exif != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + + key = get_real_key_name (key); + try { if (g_strcmp0 (key, JPEG_COMMENT) == 0) { return g_strdup (exif->image->comment().c_str()); @@ -106,6 +130,9 @@ get_exif_data (ExifData *exif, const gchar *key) gchar * get_exif_data_fixed (ExifData *exif, const gchar *key) { + g_return_val_if_fail (exif != NULL, NULL); + g_return_val_if_fail (key != NULL, NULL); + try { if (g_str_has_prefix (key, EXIF_APERTURE)) { @@ -189,6 +216,17 @@ get_exif_data_fixed (ExifData *exif, const gchar *key) return g_strdup_printf ("%ld", val); } } + + if (g_str_has_prefix (key, EXIF_CANON_CAMERA_TEMP)) { + Exiv2::ExifData &exifData = exif->image->exifData(); + if (! exifData.empty()) { + if (exifData["Exif.CanonSi.0x000c"].count() > 0) { + int long val = exifData["Exif.CanonSi.0x000c"].toLong(); + if (val > 0) + return g_strdup_printf ("%ld °C", val - 128); + } + } + } } catch (...) { return NULL; @@ -206,6 +244,8 @@ exif_has_key (ExifData *exif, const gchar *key) g_return_val_if_fail (exif != NULL, FALSE); g_return_val_if_fail (key != NULL, FALSE); + key = get_real_key_name (key); + try { if (g_strcmp0 (key, JPEG_COMMENT) == 0) { return (! exif->image->comment().empty()); diff --git a/src/jpeg-utils.h b/src/jpeg-utils.h index 7cec3a7..86602a2 100644 --- a/src/jpeg-utils.h +++ b/src/jpeg-utils.h @@ -38,6 +38,7 @@ G_BEGIN_DECLS #define EXIF_ARTIST "Exif.Image.Artist" #define EXIF_COPYRIGHT "Exif.Image.Copyright" #define EXIF_COMMENT "Exif.Photo.UserComment" +#define EXIF_CANON_CAMERA_TEMP "Exif.CanonSi.CameraTemperature" #define IPTC_COPYRIGHT "Iptc.Application2.Copyright" #define IPTC_CAPTION "Iptc.Application2.Caption" #define IPTC_AUTHOR "Iptc.Application2.Byline" -- cgit v1.2.3