summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2013-03-16 21:10:55 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2013-03-16 21:10:55 +0100
commit63771101e134b9065b6673a8b70b8d4014d359e9 (patch)
tree8661997fb350b986e21f72c553c130d1ca4b487b /src
parentc5cb4c32d746fd0e0648b386f5528fee7e39b731 (diff)
downloadcataract-63771101e134b9065b6673a8b70b8d4014d359e9.tar.xz
Add support for writing external EXIF metadata back to images
Turned off by default, this will copy all data from supplied external EXIF metadata file back to all generated image files. All user overrides are still applied on top of it. Another reason for turning this off is file size concern, target image files would carry a lot more information that may not be always needed and would increase total amount of data transferred.
Diffstat (limited to 'src')
-rw-r--r--src/generators.c12
-rw-r--r--src/jpeg-utils.cpp13
-rw-r--r--src/jpeg-utils.h1
-rw-r--r--src/setup.c1
-rw-r--r--src/setup.h1
5 files changed, 26 insertions, 2 deletions
diff --git a/src/generators.c b/src/generators.c
index 133c4c1..0e1985a 100644
--- a/src/generators.c
+++ b/src/generators.c
@@ -149,6 +149,7 @@ get_image_paths (TGallerySetup *setup,
static void
metadata_apply_overrides (ExifData *exif_data,
TGallerySetup *setup,
+ TPathInfo *path_info,
TAlbum *items,
TIndexItem *item)
{
@@ -156,12 +157,19 @@ metadata_apply_overrides (ExifData *exif_data,
g_free (exif_data->override_copyright);
exif_data->override_copyright = g_strdup (setup->add_copyright);
+
exif_data->timezone_shift = item->metadata_tz_shift;
if (exif_data->timezone_shift == 0)
exif_data->timezone_shift = items->metadata_tz_shift;
+
exif_data->fake_datetime = item->metadata_fake_datetime;
if (exif_data->fake_datetime == (time_t) -1)
exif_data->fake_datetime = items->metadata_fake_datetime;
+
+ g_free (exif_data->external_exif_data);
+ exif_data->external_exif_data = NULL;
+ if (setup->write_supplied_exif && item->metadata_external_exif)
+ exif_data->external_exif_data = g_build_filename (path_info->src_dir, item->metadata_external_exif, NULL);
}
@@ -252,7 +260,7 @@ generate_image (TGallerySetup *setup,
}
if (! is_thumbnail) {
exif_data = exif_data_new_empty ();
- metadata_apply_overrides (exif_data, setup, items, item);
+ metadata_apply_overrides (exif_data, setup, path_info, items, item);
modify_exif (img_dst, exif_data, setup->erase_exif_thumbnail);
exif_data_free (exif_data);
}
@@ -778,7 +786,7 @@ write_html_image (TGallerySetup *setup,
if (exif == NULL)
log_error ("write_html_image: error getting exif data from file \"%s\"\n", img_dst);
}
- metadata_apply_overrides (exif, setup, parent_items, item);
+ metadata_apply_overrides (exif, setup, path_info, parent_items, item);
/* Test for basic EXIF keys presence */
if (exif != NULL && exif_has_key (exif, EXIF_APERTURE) &&
exif_has_key (exif, EXIF_FOCAL_LENGTH) &&
diff --git a/src/jpeg-utils.cpp b/src/jpeg-utils.cpp
index 6483563..321a9b6 100644
--- a/src/jpeg-utils.cpp
+++ b/src/jpeg-utils.cpp
@@ -129,6 +129,7 @@ exif_data_free (ExifData *data)
{
if (data) {
g_free (data->override_copyright);
+ g_free (data->external_exif_data);
/* FIXME: free data->priv->image */
g_free (data->priv);
g_free (data);
@@ -663,6 +664,18 @@ modify_exif (const gchar *filename, ExifData *exif, gboolean strip_thumbnail)
g_assert (image.get() != 0);
image->readMetadata();
+
+ /* Write down metadata from external file if supplied */
+ if (exif && exif->external_exif_data) {
+ Exiv2::Image::AutoPtr ext_image = Exiv2::ImageFactory::open (exif->external_exif_data);
+ if (ext_image.get() != 0) {
+ ext_image->clearMetadata();
+ ext_image->readMetadata();
+ image->setMetadata (*ext_image);
+ modified = TRUE;
+ }
+ }
+
Exiv2::ExifData &exifData = image->exifData();
Exiv2::IptcData &iptcData = image->iptcData();
diff --git a/src/jpeg-utils.h b/src/jpeg-utils.h
index cc6c5c7..d393fbe 100644
--- a/src/jpeg-utils.h
+++ b/src/jpeg-utils.h
@@ -53,6 +53,7 @@ typedef struct {
gchar *override_copyright;
int timezone_shift;
time_t fake_datetime;
+ gchar *external_exif_data;
} ExifData;
diff --git a/src/setup.c b/src/setup.c
index e4df0dd..7dde0c8 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -94,6 +94,7 @@ parse_setup_xml (const gchar *filename)
setup->preload = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/preload", "value", TRUE);
setup->use_iptc_exif = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/use_iptc_exif", "value", FALSE);
setup->erase_exif_thumbnail = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/erase_embed_thumbnail", "value", FALSE);
+ setup->write_supplied_exif = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/write_supplied_exif", "value", FALSE);
setup->nofullsize = xml_file_get_node_present (xml, "/gallery_setup/images/nofullsize");
setup->autorotate = xml_file_get_node_attribute_boolean (xml, "/gallery_setup/images/autorotate", "value", TRUE);
diff --git a/src/setup.h b/src/setup.h
index daf8453..10e9d7b 100644
--- a/src/setup.h
+++ b/src/setup.h
@@ -56,6 +56,7 @@ typedef struct {
gboolean preload;
gboolean use_iptc_exif;
gboolean erase_exif_thumbnail;
+ gboolean write_supplied_exif;
gboolean nofullsize;
ThumbnailSquareType squared_thumbnail_type;
gboolean autorotate;