[gimp] libgimp: add gimp_image_metadata_load_thumbnail()



commit 1522c506a24507c9b9e1f3951386e05e01d9a585
Author: Michael Natterer <mitch gimp org>
Date:   Wed Oct 30 00:04:36 2013 +0100

    libgimp: add gimp_image_metadata_load_thumbnail()
    
    which loads an image file's Exif thumbnail into a correctly rotated
    gimp image.

 libgimp/gimpmetadata.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++
 libgimp/gimpmetadata.h |    6 +++++
 libgimp/gimpui.def     |    1 +
 3 files changed, 65 insertions(+), 0 deletions(-)
---
diff --git a/libgimp/gimpmetadata.c b/libgimp/gimpmetadata.c
index 3413693..2142acc 100644
--- a/libgimp/gimpmetadata.c
+++ b/libgimp/gimpmetadata.c
@@ -493,6 +493,64 @@ gimp_image_metadata_save_finish (gint32                  image_ID,
   return success;
 }
 
+gint32
+gimp_image_metadata_load_thumbnail (GFile   *file,
+                                    GError **error)
+{
+  GimpMetadata *metadata;
+  GInputStream *input_stream;
+  GdkPixbuf    *pixbuf;
+  guint8       *thumbnail_buffer;
+  gint          thumbnail_size;
+  gint32        image_ID = -1;
+
+  g_return_val_if_fail (G_IS_FILE (file), -1);
+  g_return_val_if_fail (error == NULL || *error == NULL, -1);
+
+  metadata = gimp_metadata_load_from_file (file, error);
+  if (! metadata)
+    return -1;
+
+  if (! gexiv2_metadata_get_exif_thumbnail (metadata,
+                                            &thumbnail_buffer,
+                                            &thumbnail_size))
+    {
+      g_object_unref (metadata);
+      return -1;
+    }
+
+  input_stream = g_memory_input_stream_new_from_data (thumbnail_buffer,
+                                                      thumbnail_size,
+                                                      (GDestroyNotify) g_free);
+  pixbuf = gdk_pixbuf_new_from_stream (input_stream, NULL, error);
+  g_object_unref (input_stream);
+
+  if (pixbuf)
+    {
+      gint32 layer_ID;
+
+      image_ID = gimp_image_new (gdk_pixbuf_get_width  (pixbuf),
+                                 gdk_pixbuf_get_height (pixbuf),
+                                 GIMP_RGB);
+      gimp_image_undo_disable (image_ID);
+
+      layer_ID = gimp_layer_new_from_pixbuf (image_ID, _("Background"),
+                                             pixbuf,
+                                             100.0, GIMP_NORMAL_MODE,
+                                             0.0, 0.0);
+      g_object_unref (pixbuf);
+
+      gimp_image_insert_layer (image_ID, layer_ID, -1, 0);
+
+      gimp_image_metadata_rotate (image_ID,
+                                  gexiv2_metadata_get_orientation (metadata));
+    }
+
+  g_object_unref (metadata);
+
+  return image_ID;
+}
+
 
 /*  private functions  */
 
diff --git a/libgimp/gimpmetadata.h b/libgimp/gimpmetadata.h
index 2c3d51a..e30ed23 100644
--- a/libgimp/gimpmetadata.h
+++ b/libgimp/gimpmetadata.h
@@ -49,6 +49,12 @@ gboolean       gimp_image_metadata_save_finish  (gint32                 image_ID
                                                  GFile                 *file,
                                                  GError               **error);
 
+
+/* this is experimental API, so be finished for 2.10 */
+
+gint32       gimp_image_metadata_load_thumbnail (GFile                 *file,
+                                                 GError               **error);
+
 G_END_DECLS
 
 #endif /* ___LIBGIMP_GIMP_METADATA_H__ */
diff --git a/libgimp/gimpui.def b/libgimp/gimpui.def
index 4fe8fe1..79d6660 100644
--- a/libgimp/gimpui.def
+++ b/libgimp/gimpui.def
@@ -40,6 +40,7 @@ EXPORTS
        gimp_image_menu_new
        gimp_image_metadata_load_finish
        gimp_image_metadata_load_prepare
+       gimp_image_metadata_load_thumbnail
        gimp_image_metadata_save_finish
        gimp_image_metadata_save_prepare
        gimp_layer_combo_box_get_type


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]