LinuxSir.cn,穿越时空的Linuxsir!

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

用了这个函数,thumbnail速度快多了

[复制链接]
发表于 2006-4-8 14:50:45 | 显示全部楼层 |阅读模式
刚在http://pemarchandet.free.fr/fvwm.html上看到的,试了一下,thumbnail速度快多了

thumb.c


#include <X11/Xlib.h>
#include <Imlib2.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
    Display *display;
    XWindowAttributes windowattr;
    Imlib_Image image;
    Imlib_Image icon;
    int windowid, thumbwidth, thumbheight;
    char *imageformat, *imagepath;
    char *iconformat, *iconpath;
    int w, h;

    if ( argc != 5 ) {
        puts("Usage: thumb WindowId ThumbWidth ThumbFile IconFile");
        return 1;
    }
    sscanf(argv[1], "%x", &windowid);
    sscanf(argv[2], "%d", &thumbwidth);
    imagepath = argv[3];
    imageformat = strrchr(argv[3], '.');
    iconpath = argv[4];
    iconformat = strrchr(argv[4], '.');

    if ( (display = XOpenDisplay(NULL)) == NULL ) return 1;
    XGetWindowAttributes(display, windowid, &windowattr);
    thumbheight = (int)((float)windowattr.height /
        ((float)windowattr.width/(float)thumbwidth));

    imlib_context_set_anti_alias(1);
    imlib_context_set_display(display);
    imlib_context_set_visual(DefaultVisual(display,
        DefaultScreen(display)));
    imlib_context_set_colormap(DefaultColormap(display,
        DefaultScreen(display)));
    imlib_context_set_drawable(windowid);

    if (4*thumbwidth >= windowattr.width ||
        4*thumbheight >= windowattr.height ) {
        image = imlib_create_image_from_drawable((Pixmap)0, 0, 0,
            windowattr.width, windowattr.height, 1);
        imlib_context_set_image(image);
        image = imlib_create_cropped_scaled_image(0, 0,
            windowattr.width, windowattr.height,
            thumbwidth, thumbheight);
    } else {
        image = imlib_create_scaled_image_from_drawable((Pixmap)0, 0, 0,
            windowattr.width, windowattr.height,
            4*thumbwidth, 4*thumbheight, 1, 1);
        imlib_context_set_image(image);
        image = imlib_create_cropped_scaled_image(0, 0,
            4*thumbwidth, 4*thumbheight,
            thumbwidth, thumbheight);
    }
    icon = imlib_load_image(argv[4]);
    imlib_context_set_image(icon);
    w = imlib_image_get_width();
    h = imlib_image_get_height();
    imlib_context_set_image(image);
    imlib_blend_image_onto_image(   icon, 0,
                                    0, 0, w, h,
                                    0, 0, w, h);
    imlib_image_set_format(imageformat + 1);
    imlib_save_image(argv[3]);

    fprintf(stdout, "WindowStyle IconOverride, Icon %s\n", argv[3]);
    return 0;
}



makefile:
CC := gcc
CFLAGS :=   -Wall -O3 -fomit-frame-pointer \
        `imlib2-config --cflags`
CPPFLAGS :=
CXXFLAGS := $(CFLAGS)
TARGET_ARCH :=  -march=athlon-xp -mcpu=athlon-xp
LDFLAGS :=  -Wl,-O1 \
        `imlib2-config --libs`
PRODUCTS := thumb

thumb: thumb.o
<tab>$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
    strip $@

修改.fvwm2rc

DestroyFunc Thumbnail
AddToFunc   Thumbnail
+ I Raise
+ I SetEnv Icon-$[w.id] $[w.IconFile]
+ I ThisWindow (!Shaded, Iconifiable, !Iconic) PipeRead \
    "$./script/thumb $[w.id] $[fvwm_icon_size] /dev/shm/icon.tmp.$[w.id].png $[w.IconFile]"
+ I Iconify

DestroyFunc DeThumbnail
AddToFunc   DeThumbnail
+ I Exec exec ogg123 -d esd $[fvwm_wave_path]/Popup.ogg
+ I PipeRead "echo WindowStyle IconOverride, Icon \\$\\[Icon-$[w.id]\\]"
+ I UnsetEnv Icon-$[w.id]
+ I Exec exec "rm -f /dev/shm/icon.tmp.$[w.id].png"
发表于 2006-4-8 23:07:03 | 显示全部楼层
其实不用自己编译的小程序而使用imagemagick的话,只是有些延迟罢了。但通用性高,为象我这样不会编程,也不会编译的人提供了不错的解决方案。
回复 支持 反对

使用道具 举报

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

本版积分规则

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