LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: atlantic.china

这是Linux下用GTK编写的一个显示图片的程序,如何使小图片拉伸。跟壁纸似的,跪求达人…

[复制链接]
发表于 2008-7-13 17:14:54 | 显示全部楼层
拿它当参考吧, 它引用了一些本地头文件你应该是没有的, 只能在 gtk 源代码中找到
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-13 17:43:35 | 显示全部楼层
哦,我继续分析这段代码,刚才睡了一觉,这两天头都大了,就被这个问题给卡住了,我现在在做实习,给我做最简单的试手,但是完全是学习啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-14 02:21:56 | 显示全部楼层
希望今天能得到您(jetking)的代码。我刚才又试了一段代码,效果不好,是只拉一个边,痛苦啊~
:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-14 23:20:00 | 显示全部楼层
jetking,呼叫jetking~~~~~~~…………
回复 支持 反对

使用道具 举报

发表于 2008-7-15 22:30:19 | 显示全部楼层

  1.   GdkPixbuf *src_pixbuf,*dst_pixbuf;
  2.   GtkWidget *image;
  3.   int x,y,len;
  4.   char file[255]="your jpeg file";

  5.   src_pixbuf=gdk_pixbuf_new_from_file(file,NULL);
  6.   if (src_pixbuf!=NULL)
  7.     {
  8.       gtk_widget_get_size_request(preview_fixed,&x,&y);
  9.         dst_pixbuf=gdk_pixbuf_scale_simple(src_pixbuf,x,y,GDK_INTERP_BILINEAR);

  10.       image=gtk_image_new();
  11.       gtk_image_set_from_pixbuf((GtkImage *)image,dst_pixbuf);
  12.       gtk_fixed_put((GtkFixed *)preview_fixed,image,0,0);

  13.       g_object_unref(src_pixbuf);
  14.       g_object_unref(dst_pixbuf);
  15.     }
复制代码


抱歉,昨天忘记了!

说明,上面演示了如何从jpgfile得到一个原始pixbuf,然后通过gdk_pixbuf_scale_simple()得到一个缩放的pixbuf,然后通过pixbuf得到一个标准的GtkImage控件,代码中的preview_fixed是放image的容器,楼主可以无视。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-16 13:16:36 | 显示全部楼层
谢谢了,这两天公司外网坏了,我一直也没上,昨天我自己也摸索出来了,就是用的gdk_pixbuf_scale_simple,呵呵,谢谢你啊。我把我现在的代码也贴上去吧。
/*
* @System:  图片全屏显示
* @summary: 这是一个图片全屏显示的程序:
*           该程序将自动获取屏幕大小信息,
*           然后程序读取一个图片路径作为参数,
*           最后程序将产生该图片全屏显示的效果。
* @create:  2008.07.15 高然
*/

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

/*
* Function:    delete_event
* Description: 这是一个回调函数。data 参数在本示例中被忽略。
*              后面有更多的回调函数示例。
*/

gint delete_event( GtkWidget *widget,
                   GdkEvent  *event,
                           gpointer   data )
{
    /* 如果你的 "delete_event" 信号处理函数返回 FALSE,
     * GTK 会发出 "destroy" 信号。
     * 返回 TRUE,你不希望关闭窗口。
     * 当你想弹出“你确定要退出吗?”对话框时它很有用。
     */

    g_print ("delete event occurred\n");

    /* 改 FALSE 为 TRUE 程序不会关闭。*/

    return FALSE;
}

/*
* Function:    destroy
* Description: 另一个回调函数
*/

void destroy( GtkWidget *widget,
              gpointer   data )
{
    gtk_main_quit ();
}

/*
* Function:    showPic
* Description: 这是一个显示图片函数。图片的路径作为参数传入,
*              然后将该函数的大小改变为屏幕大小。
* @param:      filename
*/

void showPic( char *filename )
{
    /* GtkWidget 是构件的存储类型 */
   
    GtkWidget *window;
    GtkWidget *image;
    const GdkPixbuf *src_pixbuf;
    GdkPixbuf *dest_pixbuf;
    GdkScreen *gdk_screen;
    GdkInterpType interp_type;
    gint screen_width, screen_height;
   
    /* 创建一个新窗口 */
    window = gtk_window_new ( GTK_WINDOW_TOPLEVEL );  
   
    /* 读取图片参数,存于src_pixbuf中 */
    src_pixbuf = gdk_pixbuf_new_from_file ( filename, NULL );
   
    /* 获取屏幕信息保存于gdk_screen中 */
    gdk_screen = gdk_screen_get_default();
   
    /* 获取屏幕的宽和高数据 */
    screen_width = gdk_screen_get_width ( gdk_screen );
    screen_height = gdk_screen_get_height ( gdk_screen );
   
    /* 将src_pixbuf做成屏幕大小保存于dest_pixbuf中 */
    dest_pixbuf = gdk_pixbuf_scale_simple ( src_pixbuf,
                                            screen_width, screen_height,
                                            GDK_INTERP_HYPER );  
                                         
    /* 从dest_pixbuf中读取图片存于image中 */
        image = gtk_image_new_from_pixbuf ( dest_pixbuf );

        /* 设置窗口大小 */
    gtk_window_set_default_size ( GTK_WINDOW ( window ),
                                  screen_width, screen_height );
   
        /* 将window作为容器加入图片image */
        gtk_container_add ( GTK_CONTAINER ( window ), image );
   
    /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,
     * 通常是“关闭”选项或是标题栏上的关闭按钮发出的),我们让它调用
     * 在前面定义的 delete_event() 函数。传给回调函数的 data
     * 参数值是 NULL,它会被回调函数忽略。
     */
    g_signal_connect ( G_OBJECT ( window ), "delete_event",
                               G_CALLBACK ( delete_event ), NULL );
   
    /* 在这里我们连接 "destroy" 事件到一个信号处理函数。  
     * 对这个窗口调用 gtk_widget_destroy() 函数或
     * 在 "delete_event" 回调函数中返回 FALSE 值
     * 都会触发这个事件。
     */
    g_signal_connect ( G_OBJECT ( window ), "destroy",
                               G_CALLBACK ( destroy ), NULL );
   
    /* 设置窗口边框的宽度。*/
    gtk_container_set_border_width ( GTK_CONTAINER ( window ), 0 );
   
    /* 显示窗口 */
    gtk_widget_show_all ( window );
}

/*
* Function: main
* Description: 读取图片参数,调用showPic函数
*/

int main( int argc, char *argv[] )
{   
    /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中 */
    gtk_init ( &argc, &argv );

    /* 调用 showPic()函数,传入URL参数 */
    showPic ( argv[1] );

    /* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
     * 等待事件 (如键盘事件或鼠标事件) 的发生。
     */
    gtk_main ();
   
    return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-16 13:20:46 | 显示全部楼层
这两天我是看Devhelp,真不错,跟Java的API有一拼。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-22 09:47:32 | 显示全部楼层
现在我的程序出现了Bug,就是在旋转之后在屏幕上方会出现一道白杠,并且从左至右越来越粗,大侠知道是怎么回事么
回复 支持 反对

使用道具 举报

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

本版积分规则

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