⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testpixbuf-save.c

📁 Linux下gtk图形界面开发的各种gtk控件调用方法示例
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */#include "config.h"#include <stdio.h>#include <gtk/gtk.h>static voidcompare_pixbufs (GdkPixbuf *pixbuf, GdkPixbuf *compare, const gchar *file_type){        if ((gdk_pixbuf_get_width (pixbuf) !=             gdk_pixbuf_get_width (compare)) ||            (gdk_pixbuf_get_height (pixbuf) !=             gdk_pixbuf_get_height (compare)) ||            (gdk_pixbuf_get_n_channels (pixbuf) !=             gdk_pixbuf_get_n_channels (compare)) ||            (gdk_pixbuf_get_has_alpha (pixbuf) !=             gdk_pixbuf_get_has_alpha (compare)) ||            (gdk_pixbuf_get_bits_per_sample (pixbuf) !=             gdk_pixbuf_get_bits_per_sample (compare))) {                fprintf (stderr,                         "saved %s file differs from copy in memory\n",                         file_type);        } else {                guchar *orig_pixels;                guchar *compare_pixels;                gint    orig_rowstride;                gint    compare_rowstride;                gint    width;                gint    height;                gint    bytes_per_pixel;                gint    x, y;                guchar *p1, *p2;                gint    count = 0;                orig_pixels = gdk_pixbuf_get_pixels (pixbuf);                compare_pixels = gdk_pixbuf_get_pixels (compare);                orig_rowstride = gdk_pixbuf_get_rowstride (pixbuf);                compare_rowstride = gdk_pixbuf_get_rowstride (compare);                width = gdk_pixbuf_get_width (pixbuf);                height = gdk_pixbuf_get_height (pixbuf);                /*  well...  */                bytes_per_pixel = gdk_pixbuf_get_n_channels (pixbuf);                p1 = orig_pixels;                p2 = compare_pixels;                for (y = 0; y < height; y++) {                        for (x = 0; x < width * bytes_per_pixel; x++)                                count += (*p1++ != *p2++);                        orig_pixels += orig_rowstride;                        compare_pixels += compare_rowstride;                        p1 = orig_pixels;                        p2 = compare_pixels;                }                if (count > 0) {                        fprintf (stderr,                                 "saved %s file differs from copy in memory\n",                                 file_type);                }        }}static gbooleansave_to_loader (const gchar *buf, gsize count, GError **err, gpointer data){        GdkPixbufLoader *loader = data;        return gdk_pixbuf_loader_write (loader, buf, count, err);}static GdkPixbuf *buffer_to_pixbuf (const gchar *buf, gsize count, GError **err){        GdkPixbufLoader *loader;        GdkPixbuf *pixbuf;        loader = gdk_pixbuf_loader_new ();        if (gdk_pixbuf_loader_write (loader, buf, count, err) &&             gdk_pixbuf_loader_close (loader, err)) {                pixbuf = g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader));                g_object_unref (loader);                return pixbuf;        } else {                return NULL;        }}static voiddo_compare (GdkPixbuf *pixbuf, GdkPixbuf *compare, GError *err){        if (compare == NULL) {                fprintf (stderr, "%s", err->message);                g_error_free (err);        } else {                compare_pixbufs (pixbuf, compare, "jpeg");                g_object_unref (compare);        }}static voidkeypress_check (GtkWidget *widget, GdkEventKey *evt, gpointer data){        GdkPixbuf *pixbuf;        GtkDrawingArea *da = (GtkDrawingArea*)data;        GError *err = NULL;        gchar *buffer;        gsize count;        GdkPixbufLoader *loader;        pixbuf = (GdkPixbuf *) g_object_get_data (G_OBJECT (da), "pixbuf");        if (evt->keyval == 'q')                gtk_main_quit ();        if (evt->keyval == 's' && (evt->state & GDK_CONTROL_MASK)) {                /* save to callback */                if (pixbuf == NULL) {                        fprintf (stderr, "PIXBUF NULL\n");                        return;                }	                loader = gdk_pixbuf_loader_new ();                if (!gdk_pixbuf_save_to_callback (pixbuf, save_to_loader, loader, "jpeg",                                                  &err,                                                  "quality", "100",                                                  NULL) ||                    !gdk_pixbuf_loader_close (loader, &err)) {                        fprintf (stderr, "%s", err->message);                        g_error_free (err);                } else {                        do_compare (pixbuf,                                    g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader)),                                    err);                        g_object_unref (loader);                }        }        else if (evt->keyval == 'S') {                /* save to buffer */                if (!gdk_pixbuf_save_to_buffer (pixbuf, &buffer, &count, "jpeg",                                                &err,                                                "quality", "100",                                                NULL)) {                        fprintf (stderr, "%s", err->message);                        g_error_free (err);                } else {                        do_compare (pixbuf,                                    buffer_to_pixbuf (buffer, count, &err),                                    err);                }        }        else if (evt->keyval == 's') {                /* save normally */                if (pixbuf == NULL) {                        fprintf (stderr, "PIXBUF NULL\n");                        return;                }	                if (!gdk_pixbuf_save (pixbuf, "foo.jpg", "jpeg",                                      &err,                                      "quality", "100",                                      NULL)) {                        fprintf (stderr, "%s", err->message);                        g_error_free (err);                } else {                        do_compare (pixbuf,                                    gdk_pixbuf_new_from_file ("foo.jpg", &err),                                    err);                }        }        if (evt->keyval == 'p' && (evt->state & GDK_CONTROL_MASK)) {                /* save to callback */                if (pixbuf == NULL) {                        fprintf (stderr, "PIXBUF NULL\n");                        return;                }                loader = gdk_pixbuf_loader_new ();                if (!gdk_pixbuf_save_to_callback (pixbuf, save_to_loader, loader, "png",                                                  &err,                                                  "tEXt::Software", "testpixbuf-save",                                                  NULL)                    || !gdk_pixbuf_loader_close (loader, &err)) {                        fprintf (stderr, "%s", err->message);                        g_error_free (err);                } else {                        do_compare (pixbuf,                                    g_object_ref (gdk_pixbuf_loader_get_pixbuf (loader)),                                    err);                        g_object_unref (loader);                }        }        else if (evt->keyval == 'P') {                /* save to buffer */                if (!gdk_pixbuf_save_to_buffer (pixbuf, &buffer, &count, "png",                                                &err,                                                "tEXt::Software", "testpixbuf-save",                                                NULL)) {                        fprintf (stderr, "%s", err->message);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -