LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1737|回复: 9

请教:gdk_pixbuf_new_from_file("...")少了参数?

[复制链接]
发表于 2004-12-2 22:52:09 | 显示全部楼层 |阅读模式
我想使用gdk_pixbuf_new_from_file("...")来加载一张图片:
GdkPixbuf *img_buf;
img_buf = gdk_pixbuf_new_from_file("./zhou.bmp");
但是编译的时候,得到如下错误:
main.c: In function `main':
main.c:47: too few arguments to function `gdk_pixbuf_new_from_file'
怎么会少了参数?John R.Sheets的《GNOME应用程序开发指南》是这样用的,我又用:
grep "gdk_pixbuf_new_from_file" /usr/include/gdk-pixbuf/gdk_pixbuf.h
查看了,也是这种形式。为什么会错呢?

望各位不吝赐教。谢谢。
发表于 2004-12-2 23:02:33 | 显示全部楼层
把这个函数单独写一个小程序编译看看还有没有这个问题。如果没有,问题可能出在别的地方。
 楼主| 发表于 2004-12-2 23:04:58 | 显示全部楼层
我就是写在一个小程序中的呀。首先我用glade2生成了一个简单程序,编译、运行都没有问题,然后加上这几行就通不过了。
发表于 2004-12-3 09:04:17 | 显示全部楼层
为什么我看到的不一样?你看到的头文件可能不是你用的那个版本的。

GdkPixbuf*  gdk_pixbuf_new_from_file (const char *filename, GError **error);

http://developer.gnome.org/doc/A ... f-file-loading.html
 楼主| 发表于 2004-12-3 15:57:11 | 显示全部楼层
是的,这样编译通过了。先感想doubleelec的帮助。但怎样绘制出来我还有疑问。所用的绘图函数应该是:
void gdk_pixbuf_render_threshold_alpha(GdkPixbuf *pixbuf,GdkBitmap *bitmap, int src_x, int src_y, int dest_x, int dest_y, int width, int height, int alpha_threshold);
而图象应该是显示在:GtkWidget *drawing_area = gtk_drawing_area_new();中的。
如何使这两者发生联系呢?应该是用的GdkPixmap吧,我在一个GTK编程的中文材料上看到:
GdkPixmap* gdk_pixmap_new(GdkWindow  *window, gint width, gint height, gint depth);
但并没有讲怎样绘制到drawing_area.

在《GNOME应用程序开发指南》的例程中,是这样解决的:
GtkWidget *drawing_area;
GdkPixmap *dbuf_pixmap = NULL;

GtkWidget *app;
drawing_area = gtk_drawing_area_new();
...
gnome_app_set_contents(GNOME_APP(app), drawing_area);
gtk_widget_show_all(app);
dbuf_pixmap = gdk_pixmap_new(app->window, WIDTH, HEIGTH, -1);
...
然后就可以加载图象并绘制了,绘制时第二个参数就是dbuf_pixmap。这使我有些疑惑,app->window和drawing_area是什么关系??

我用glade2生成的程序,drawing_area放置在一个hbox中,我使用这样一段代码:
/* Load form an image file. */
img_buf = gdk_pixbuf_new_from_file("./zhou.bmp", NULL);
  width = gdk_pixbuf_get_width(img_buf);
  height = gdk_pixbuf_get_height(img_buf);
  g_message("width: %d, height: %d\n", width, height);
  pixmap_buf = gdk_pixmap_new(GTK_WIDGET(img_win)->window, width, height, -1);
  /* Render */
  gdk_pixbuf_render_to_drawable_alpha(img_buf, pixmap_buf,
        0, 0, 0, 0, width, height,
        GDK_PIXBUF_ALPHA_BILEVEL, 128,
        GDK_RGB_DITHER_NORMAL, 0, 0);
但是运行的时候出现如下错误:
(image:1804): Gdk-CRITICAL **: file gdkpixmap-x11.c: line 166 (gdk_pixmap_new): assertion `(window != NULL) || (depth != -1)' failed

(image:1804): Gdk-CRITICAL **: file gdkdraw.c: line 590 (_gdk_draw_pixbuf): assertion `GDK_IS_DRAWABLE (drawable)' failed

在那本书中,绘制函数使用的第二个参数的数据类型是:
GdkDrawable *drawable.

谢谢。
 楼主| 发表于 2004-12-3 17:19:04 | 显示全部楼层
我查看了gtk-demo的例程:

  1. do_pixbufs (void)
  2. {
  3. ...
  4.   da = gtk_drawing_area_new ();
  5.   g_signal_connect (da, "expose_event",
  6.     G_CALLBACK (expose_cb), NULL);
  7.   gtk_container_add (GTK_CONTAINER (window), da);
  8. ...
  9. }

  10. static gint expose_cb (GtkWidget *widget,
  11.    GdkEventExpose *event,
  12.    gpointer           data)
  13. {
  14.   guchar *pixels;
  15.   int rowstride;

  16.   rowstride = gdk_pixbuf_get_rowstride (frame);

  17.   pixels = gdk_pixbuf_get_pixels (frame) + rowstride * event->area.y + event->area.x * 3;

  18.   gdk_draw_rgb_image_dithalign (widget->window,
  19.                                 widget->style->black_gc,
  20.                                 event->area.x, event->area.y,
  21.                                 event->area.width, event->area.height,
  22.                                 GDK_RGB_DITHER_NORMAL,
  23.                                 pixels, rowstride,
  24.                                 event->area.x, event->area.y);

  25.   return TRUE;
  26. }
复制代码

gdk_draw_rgb_image_dithalign()的原型是:

  1. void gdk_draw_rgb_image_dithalign(GdkDrawable *drawable,
  2.   GdkGc *gc, gint x, gint y, gint width, gint height,
  3.   GdkRgbDither dith, guchar *rgb_buf, gint rowstride,
  4.   gint xdith, gint ydith);
复制代码

和gdk_pixbuf_render_to_drawable_alpha()一样,使用GdkDrawable, 但在调用的时候,不是使用widget吗?但我使用如下的方法却不行:

  1. img_drawing = gtk_drawing_area_new ();
  2. ...
  3. gdk_pixbuf_render_to_drawable_alpha(img_buf,
  4.         GTK_WIDGET(img_drawing)->window,
  5.         0, 0, 0, 0, width, height,
  6.         GDK_PIXBUF_ALPHA_BILEVEL, 128,
  7.         GDK_RGB_DITHER_NORMAL, 0, 0);
复制代码

我想直接cast过来就可以了吧,却不行。难道一定要写在回调函数中才行吗?
 楼主| 发表于 2004-12-4 22:28:18 | 显示全部楼层
我写到一个回调函数中后就可以运行了。但道理何在,有些不明白。
发表于 2004-12-6 09:33:46 | 显示全部楼层
不好意思,我已看晕了

那两个 Gdk-CRITICAL 可能是因为你做绘制操作的时候 window 或其他什么东西还没有真正的创建,而某个控件消息的回调函数被执行的时候 window 显然已经创建了,所以又行了。具体的原因自己慢慢找了,呵呵。
 楼主| 发表于 2004-12-6 18:43:35 | 显示全部楼层
是呀,我怎么吧这一点忘了。doubleelec兄分析得很对,在此表示感谢。我把代码写到main.c中的gtk_widget_show()后面,运行就没有上面的错误了。但奇怪的是图象却显示不出来,用gdk_pixbuf_get_width()、gdk_pixbuf_get_height()得到的数据都正确。我昨天在一个键盘响应的回调函数中执行那段代码又很好。
发表于 2004-12-7 08:41:05 | 显示全部楼层
还是类似的问题,好像有一个事件是表示窗口已经真正的显示,你把那段代码加在这个事件的回调函数中,不知是否能达到你的目的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表