漂浮在另一个上的图像

时间:2011-03-03 04:18:45

标签: canvas gtk cairo

我希望能够使用Cairo或GTK功能在我的应用中动态地将图像放在另一个图像上。想象一下,例如,用户放置鱼类和海洋动物的海洋:就像那样。

我该怎么做?如果您不知道但记住任何简单的程序或演示,那么也非常欢迎!

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用GtkDrawingArea并使用cairo在其上绘制图像:

示例:

#include <cairo.h>
#include <gtk/gtk.h>

cairo_surface_t * sea_surface;
cairo_surface_t * fish_surface;

gboolean on_expose_event(GtkWidget * widget, GdkEventExpose * event, gpointer data) {
    // Create the cairo instance.
    cairo_t * cr = gdk_cairo_create(widget->window);
    // Draw the sea background.
    cairo_set_source_surface(cr, sea_surface, 0.0, 0.0);
    cairo_paint(cr);
    // Draw the fish.
    cairo_set_source_surface(cr, fish_surface, 50.0, 50.0);
    cairo_paint(cr);
    // Destroy the cairo instance.
    cairo_destroy(cr);
    return FALSE;
}

int main(int argc, char * argv[]) {
    gtk_init(&argc, &argv);

    // Load images.
    sea_surface = cairo_image_surface_create_from_png("sea.png");
    fish_surface = cairo_image_surface_create_from_png("fish.png");

    // Create window.
    GtkWidget * window;
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_window_set_default_size(GTK_WINDOW(window), 320, 240);  

    // Create drawing area where we're going to draw our images.
    GtkWidget * drawing_area = gtk_drawing_area_new();
    g_signal_connect(G_OBJECT(drawing_area), "expose-event", G_CALLBACK(on_expose_event), NULL);
    gtk_container_add(GTK_CONTAINER(window), drawing_area);

    // Show window and start gtk main loop.
    gtk_widget_show_all(window);
    gtk_main();

    // Clean-up.
    cairo_surface_destroy(fish_surface);
    cairo_surface_destroy(sea_surface);
    return 0;
}

要在linux上编译它使用:

gcc -Wall -g images.c -o images `pkg-config --cflags --libs gtk+-2.0`

文档:

示例:


编辑:如果您需要能够从Java执行此操作,则可以使用java-gnome为GTK和cairo提供绑定。

答案 1 :(得分:1)

我会使用clutter,详细使用杂乱的例子,它们非常好。

修改

如果你不能使用杂乱,你可以查看cairo,它在给定的主页上也有一些简洁的例子

答案 2 :(得分:1)

您还可以将GtkDrawingAreaGdk drawing primitives

一起使用

答案 3 :(得分:0)

最好的方法是使用像goocanvas这样的画布,它可以与GTK一起使用并使用cairo绘制。但是,它似乎目前只有C ++和python的绑定,所以如果你使用java,你将不得不找到别的东西......