gthumb r2242 - in trunk: . libgthumb
- From: mjc svn gnome org
- To: svn-commits-list gnome org
- Subject: gthumb r2242 - in trunk: . libgthumb
- Date: Fri, 1 Feb 2008 13:08:46 +0000 (GMT)
Author: mjc
Date: Fri Feb 1 13:08:45 2008
New Revision: 2242
URL: http://svn.gnome.org/viewvc/gthumb?rev=2242&view=rev
Log:
2008-02-01 Michael J. Chudobiak <mjc svn gnome org>
* libgthumb/gth-exiv2-utils.cpp:
Delete IFD1 (thumbnail data) after updating metadata. Allow the
addition of new tags (before, it only allowed updates of existing
tags). Patch by Andreas Huggel <ahuggel gmx net>.
Modified:
trunk/ChangeLog
trunk/libgthumb/gth-exiv2-utils.cpp
Modified: trunk/libgthumb/gth-exiv2-utils.cpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.cpp (original)
+++ trunk/libgthumb/gth-exiv2-utils.cpp Fri Feb 1 13:08:45 2008
@@ -355,7 +355,7 @@
}
/*
- * read_exif2_file
+ * read_exiv2_file
* reads metadata from image files
* code relies heavily on example1 from the exiv2 website
* http://www.exiv2.org/example1.html
@@ -534,49 +534,58 @@
const char *key,
const char *value)
{
- //Open first image
- Exiv2::Image::AutoPtr image1 = Exiv2::ImageFactory::open (from_file);
- g_assert (image1.get() != 0);
-
- // Load existing metadata
- image1->readMetadata();
-
- // Update the requested tag
- if (key != NULL) {
- if (g_str_has_prefix (key, "Exif")) {
- Exiv2::ExifKey ek (key);
- Exiv2::ExifData &md = image1->exifData();
- Exiv2::ExifData::iterator pos = md.findKey(ek);
- if (pos != md.end())
- pos->setValue(value);
- }
- else if (g_str_has_prefix (key, "Iptc")) {
- Exiv2::IptcKey ek (key);
- Exiv2::IptcData &md = image1->iptcData();
- Exiv2::IptcData::iterator pos = md.findKey(ek);
- if (pos != md.end())
- pos->setValue(value);
- }
- else if (g_str_has_prefix (key, "Xmp")) {
- Exiv2::XmpKey ek (key);
- Exiv2::XmpData &md = image1->xmpData();
- Exiv2::XmpData::iterator pos = md.findKey(ek);
- if (pos != md.end())
- pos->setValue(value);
- }
- }
+ try {
+ //Open first image
+ Exiv2::Image::AutoPtr image1 = Exiv2::ImageFactory::open (from_file);
+ g_assert (image1.get() != 0);
+
+ // Load existing metadata
+ image1->readMetadata();
+
+ // TODO: accept a GthMetadata structure instead of a single
+ // key/value pair.
+
+ // Update the requested tag
+ if (key != NULL) {
+ if (g_str_has_prefix (key, "Exif")) {
+ Exiv2::ExifData &md = image1->exifData();
+ md[key] = value;
+
+ // TODO: update PixelX/YDimension tags
+
+ // TODO: add any missing mandatory tags
+ }
+ else if (g_str_has_prefix (key, "Iptc")) {
+ Exiv2::IptcData &md = image1->iptcData();
+ md[key] = value;
+ }
+ else if (g_str_has_prefix (key, "Xmp")) {
+ Exiv2::XmpData &md = image1->xmpData();
+ md[key] = value;
+ }
+ }
+
+ // Delete thumbnail and IFD1 tags, because the main image may
+ // have changed, and gThumb doesn't use the embedded thumbnails
+ // anyways.
+ image1->exifData().eraseThumbnail();
+
+ // Open second image (in many applications, this will actually
+ // be the same as the the first image (i.e., updating a file
+ // in-place.
+ Exiv2::Image::AutoPtr image2 = Exiv2::ImageFactory::open (to_file);
+ g_assert (image2.get() != 0);
+
+ image2->setExifData (image1->exifData());
+ image2->setIptcData (image1->iptcData());
+ image2->setXmpData (image1->xmpData());
- // Open second image
- Exiv2::Image::AutoPtr image2 = Exiv2::ImageFactory::open (to_file);
- g_assert (image2.get() != 0);
-
- // TODO: delete IFD1 here
-
- image2->setExifData (image1->exifData());
- image2->setIptcData (image1->iptcData());
- image2->setXmpData (image1->xmpData());
+ // overwrite existing metadata with new metadata
+ image2->writeMetadata();
+ }
- // overwrite existing metadata with new metadata
- image2->writeMetadata();
+ catch (const Exiv2::AnyError& e) {
+ // TODO: signal an error to the caller?
+ // (e.what() returns a const char* error message)
+ }
}
-
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]