[gimp/wip/animation: 140/197] plug-ins: export also sequence of images.
- From: Jehan Pagès <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/wip/animation: 140/197] plug-ins: export also sequence of images.
- Date: Sat, 7 Oct 2017 03:10:12 +0000 (UTC)
commit b70fb642e46f6918c1b7bf53defad17357001291
Author: Jehan <jehan girinstud io>
Date: Mon May 22 16:01:20 2017 +0200
plug-ins: export also sequence of images.
I recognize only png, jpeg and tiff formats for now.
Also allow to create directories through the file chooser dialog.
.../widgets/animation-dialog-export.c | 90 +++++++++++++++++++-
1 files changed, 87 insertions(+), 3 deletions(-)
---
diff --git a/plug-ins/animation-play/widgets/animation-dialog-export.c
b/plug-ins/animation-play/widgets/animation-dialog-export.c
index 1012610..b8d2fbd 100644
--- a/plug-ins/animation-play/widgets/animation-dialog-export.c
+++ b/plug-ins/animation-play/widgets/animation-dialog-export.c
@@ -35,8 +35,10 @@
#include "animation-dialog.h"
#include "animation-dialog-export.h"
-static void animation_dialog_export_video (AnimationPlayback *playback,
- gchar *filename);
+static void animation_dialog_export_video (AnimationPlayback *playback,
+ gchar *filename);
+static void animation_dialog_export_images (AnimationPlayback *playback,
+ gchar *filename);
void
animation_dialog_export (GtkWindow *main_dialog,
@@ -45,6 +47,7 @@ animation_dialog_export (GtkWindow *main_dialog,
GtkWidget *dialog;
GtkFileFilter *all;
GtkFileFilter *videos;
+ GtkFileFilter *images;
gchar *filename = NULL;
dialog = gtk_file_chooser_dialog_new (_("Export animation"),
@@ -54,6 +57,7 @@ animation_dialog_export (GtkWindow *main_dialog,
_("_Export"), GTK_RESPONSE_ACCEPT,
NULL);
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
+ gtk_file_chooser_set_create_folders (GTK_FILE_CHOOSER (dialog), TRUE);
/*gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
default_folder_for_saving);*/
/*gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog),
@@ -81,6 +85,18 @@ animation_dialog_export (GtkWindow *main_dialog,
gtk_file_filter_add_mime_type (videos, "video/x-matroska");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), videos);
+ images = gtk_file_filter_new ();
+ gtk_file_filter_set_name (images, _("Image Sequences"));
+ gtk_file_filter_add_pattern (images, "*.[pP][nN][gG]");
+ gtk_file_filter_add_pattern (images, "*.[tT][iI][fF][fF]");
+ gtk_file_filter_add_pattern (images, "*.[tT][iI][fF]");
+ gtk_file_filter_add_pattern (images, "*.[jJ][pP][gG]");
+ gtk_file_filter_add_pattern (images, "*.[jJ][pP][eE][gG]");
+ gtk_file_filter_add_mime_type (images, "image/tiff");
+ gtk_file_filter_add_mime_type (images, "image/png");
+ gtk_file_filter_add_mime_type (images, "image/jpeg");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), images);
+
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), videos);
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
@@ -88,9 +104,27 @@ animation_dialog_export (GtkWindow *main_dialog,
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
}
gtk_widget_destroy (dialog);
+
if (filename)
{
- animation_dialog_export_video (playback, filename);
+ gchar *lower = g_ascii_strdown (filename, -1);
+
+ /* check the type of files. */
+ if (g_str_has_suffix (lower, ".png") ||
+ g_str_has_suffix (lower, ".jpg") ||
+ g_str_has_suffix (lower, ".jpeg") ||
+ g_str_has_suffix (lower, ".tiff") ||
+ g_str_has_suffix (lower, ".tif"))
+ {
+ animation_dialog_export_images (playback, filename);
+ }
+ else
+ {
+ /* We assume unrecognized type are videos. I doubt that's
+ * a good assumption, but enough for a first hack. */
+ animation_dialog_export_video (playback, filename);
+ }
+ g_free (lower);
g_free (filename);
}
}
@@ -135,3 +169,53 @@ animation_dialog_export_video (AnimationPlayback *playback,
g_object_unref (graph);
g_signal_emit_by_name (animation, "loaded");
}
+
+static void
+animation_dialog_export_images (AnimationPlayback *playback,
+ gchar *filename)
+{
+ Animation *animation;
+ GeglNode *graph;
+ GeglNode *export;
+ GeglNode *input;
+ gint duration;
+ gchar *ext;
+ gint i;
+
+ ext = g_strrstr (filename, ".");
+ g_return_if_fail (ext);
+ *ext = '\0';
+ ext++;
+
+ animation = animation_playback_get_animation (playback);
+ duration = animation_get_duration (animation);
+ graph = gegl_node_new ();
+ export = gegl_node_new_child (graph,
+ "operation", "gegl:save",
+ NULL);
+ input = gegl_node_new_child (graph,
+ "operation", "gegl:buffer-source",
+ NULL);
+ gegl_node_link_many (input, export, NULL);
+
+ for (i = 0; i < duration; i++)
+ {
+ GeglBuffer *buffer;
+ gchar *path;
+
+ g_signal_emit_by_name (animation, "loading",
+ (gdouble) i / ((gdouble) duration - 0.999));
+ path = g_strdup_printf ("%s-%.*d.%s",
+ filename,
+ (gint) floor (log10(duration)) + 1,
+ i + 1, ext);
+ buffer = animation_playback_get_buffer (playback, i);
+ gegl_node_set (input, "buffer", buffer, NULL);
+ gegl_node_set (export, "path", path, NULL);
+ gegl_node_process (export);
+ g_object_unref (buffer);
+ g_free (path);
+ }
+ g_object_unref (graph);
+ g_signal_emit_by_name (animation, "loaded");
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]