QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1294|回复: 12

gtk图像操作问题!!

[复制链接]
发表于 2005-8-5 13:41:14 | 显示全部楼层 |阅读模式
我用glade工具在一个窗口引入了一副图像!现在假设图像有1,2,3,4,共四个区域.如果我想将区域4覆盖区域1,我该怎么做,在网上有人说用gdk_pixbuf_copy_area(),如果这样好像需要使用gdk_pixbuf_new_from_file(),但是我的图像imge1是glade自动生成的.我现在该怎么做?? 大侠们能不能给偶举个例子,或指点指点偶,谢谢!
发表于 2005-8-5 14:14:54 | 显示全部楼层
楼主写的我看不明白,GLADE引入的不也是有一个图像的文件名的?
回复

使用道具 举报

 楼主| 发表于 2005-8-5 14:23:41 | 显示全部楼层
可是这个图像名能直接引用吗?
另外,gdk_pixbuf_copy_area这个函数中的src,dest不能相同.这是个老外说的.那我该怎么处理呢??

===================================================
  GError **myerror;
  GdkPixbuf *image1, *final_image1;
    image1=gdk_pixbuf_new_from_file("/home/xuehu/move/pixmap/jme8611jp.bmp",myerror);        final_image1 = ...


  gdk_pixbuf_copy_area(image1,30,323,27,30,final_image1,3,46);
====================================================   

我是想在同一副图像里实现不同区域的复制,我的这个final_image1和image1是同一副图像,我该怎么写才能达到我的效果呀?? 这样做没效果呀!!
回复

使用道具 举报

发表于 2005-8-5 14:31:23 | 显示全部楼层
[quote:87206778d8="xue_hu2001"]可是这个图像名能直接引用吗?
另外,gdk_pixbuf_copy_area这个函数中的src,dest不能相同.这是个老外说的.那我该怎么处理呢??

===================================================
  GError **myerror;
  GdkPixbuf *image1, *final_image1;
  image1 = gdk_pixbuf_new_from_file("/home/xuehu/move/pixmap/jme8611jp.bmp",myerror);
  final_image1 = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 622, 250);


  gdk_pixbuf_copy_area(image1,30,323,27,30,final_image1,3,46);
====================================================   

这样做没效果呀!![/quote]
GdkPixbuf*  gdk_pixbuf_new_subpixbuf        (GdkPixbuf *src_pixbuf,
                                             int src_x,
                                             int src_y,
                                             int width,
                                             int height);
有这个函数代替gdk_pixbuf_copy_area试试。

其实我还是不太清楚,楼主想要实现什么?是一个窗口中显示四个图片,还是吧一个图片分成四个块显示出来?
回复

使用道具 举报

 楼主| 发表于 2005-8-5 14:38:55 | 显示全部楼层
我主要是想实现这样的功能:
1,窗口中含有一个图像,这个图像有4个区域  
2,当含有图像的窗口接收到鼠标点击事件后,区域4就会被复制到区域1.

请问gdk_pixbuf_new_subpixbuf这个函数能实现我所要的功能吗?
回复

使用道具 举报

发表于 2005-8-5 14:41:09 | 显示全部楼层
[quote:d62039dfd0="xue_hu2001"]我主要是想实现这样的功能:
1,窗口中含有一个图像,这个图像有4个区域  
2,当含有图像的窗口接收到鼠标点击事件后,区域4就会被复制到区域1.

请问gdk_pixbuf_new_subpixbuf这个函数能实现我所要的功能吗?[/quote]
可以的,其实不用pixbuf,用pixmap也能实现!
回复

使用道具 举报

 楼主| 发表于 2005-8-5 14:47:59 | 显示全部楼层
用pixmap要怎么实现??偶觉得pixbuf用起来十分麻烦!谢谢!!
回复

使用道具 举报

发表于 2005-8-5 15:08:15 | 显示全部楼层
[quote:4d457b71b8="xue_hu2001"]我主要是想实现这样的功能:
1,窗口中含有一个图像,这个图像有4个区域  [/quote]
首先不是特别明白图像有4个区域 是什么意思?我在这个理解就是一幅图分成四块来显示。下面的思路是按照这个来写的。
0.drawarea = gtk_drawing_area_new ();创建一个drawarea
1. pixbuf = gdk_pixbuf_new_from_file ("zhuyaogonglu.jpg",NULL); //创建一个pixbuf
2.pixmap = gdk_pixmap_new (widget->window,
                        widget->allocation.width,widget->allocation.height,-1);//创建一个pixmap,widget->window就是drawarea的窗口,我在configure_event事件中创建,configure_event会在drawarea显示时调用,看个人喜好了。
3.gdk_draw_pixbuf (pixmap,drawarea->style->white_gc,pixbuf,
                                        0,0,0,0,width,height,0,0,0);//把pixbuf中图片考到pixmap中。这个函数中的src_x,src_y,结合宽、高,就能把pixbuf中的任何一块考贝到pixmap中
5.gdk_draw_drawable (widget->window,
                     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
                     pixmap,
                     event->area.x, event->area.y,
                     event->area.x, event->area.y,
                     event->area.width, event->area.height);//在expose_event事件中调用,显示图片,expose_event在gtk_widget_show_all (window);或每次窗口被别的窗口盖住,当别的窗口离开时会产生这个事件。widget->window还是drawarea的控件窗口。
5.鼠标点击后还是调用3中的gdk_draw_pixbuf,改变src_x,src_y的值(width,height视情况改变),然后调用gtk_widget_queue_draw_area  (widget, 0,0, width,height)来产生expost_event事件去调用gdk_draw_drawable来显示新的内容。gtk_widget_queue_draw_area中的widget就是drawarea。
回复

使用道具 举报

 楼主| 发表于 2005-8-5 15:18:44 | 显示全部楼层
谢谢kan大大热心帮助.我说的一个窗口中含有一个图像,这个图像有4个区域实际是这个意思:

第一个区域: x = 0   , y = 0  , w = 50 , h = 50
第二个区域: x = 0   , y = 50 , w = 50 , h = 50
第三个区域: x = 50  , y = 0  , w = 50 , h = 50
第四个区域: x = 50  , y = 50 , w = 50 , h = 50

x,y,w,h ---> x坐标  y坐标, 宽 , 高
回复

使用道具 举报

发表于 2005-8-5 15:28:03 | 显示全部楼层
2.pixmap = gdk_pixmap_new (widget->window,
50,50,-1);
3.gdk_draw_pixbuf (pixmap,drawarea->style->white_gc,pixbuf,
src_x,src_y,0,0,50,50,0,0,0)
这个中的第4,5个参数src_x,src_y,在点鼠标后,分别用下面的,X,Y代替就可以了。
第一个区域: x = 0 , y = 0 , w = 50 , h = 50
第二个区域: x = 0 , y = 50 , w = 50 , h = 50
第三个区域: x = 50 , y = 0 , w = 50 , h = 50
第四个区域: x = 50 , y = 50 , w = 50 , h = 50
回复

使用道具 举报

 楼主| 发表于 2005-8-5 15:31:43 | 显示全部楼层
谢谢kan大大.最近被这个问题弄的好头痛.今天终于可以了.
回复

使用道具 举报

发表于 2005-8-5 15:55:20 | 显示全部楼层
不客气
回复

使用道具 举报

 楼主| 发表于 2005-8-5 17:00:37 | 显示全部楼层
以后还有好多问题要请教你,你可不要客气哟!    
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 15:49 , Processed in 0.046858 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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