分享

XBM & XPM - X系统下的图标文件

 离魂异客 2010-12-26
一)XBM
XBM是单色的位图的表示方法。从计算机历史的演变来看,这个应该是比较早在计算机中使用的图标文件格式。XBM是直接用C语言描述的单色位图格式。
示例:
#define FOO_width 8
#define FOO_height 8
#define FOO_x_hot 0
#define FOO_y_hot 7
static unsigned char FOO_bits[] =
    { 0x3E, 0x80, 0x00, 0x7C, 0x00, 0x82, 0x41, 0x00};
解释:
1)4个宏定义中,前两个是必须的。即定义位图的宽和高。后两个是可选的,定义位图的热点。啥是热点?这种位图一般是用来当图标用的。比如作为鼠标,那么鼠标图片其实是个矩形,而热点就是这个矩形里那个“鼠标尖”所在位置的坐标。
2)跟着后面的数组就是位图数据。单色位置即一个像素用一个BIT表示。如果图片宽度不是8的倍数,那么一行数据的最后一个字节的后几个BIT将被忽略,即不使用。
3)XBM有两种格式,一种是X10格式,一种是X11格式。不同之处在于像素数据的打包方式。X10是用16BIT的unsigned short来表示像素数据,而X11是用8BIT的unsigned char来打包像素数据。
4)YY一下:早期的计算机是单色的,表达的东西也很简单明了。而且设计得很“程序员化”,即可与程序代码兼容,即直接把它当成C源代码编译,也可以当成独立的文件保存。因为可以专门设计工具来打开并渲染这种文件。

二)XPM
XPM是XBM的扩展。它支持单色位图,也支持不同灰阶位图,也支持彩色位图。这种格式保持了XBM的“程序员化”设计,也是直接用C语言来描述的。而且还有ASCII艺术的影子在里面。ASCII艺术是早期计算机里比较经典且流行的一种程序员艺术。就是用不同的字母和符号来画图。其核心结构是这样,用C语言的字符串数组来表示。第一行表达位图的基本信息,如长宽等。第二部分是位图中用到的颜色映射。即用N个字符映射成颜色。第三部分是位图的像素数据。直接用字符来作画。第四部分是扩展部分数据。

格式:

static char * <pixmap_name>[] =
{
<Values>
<Colors>
<Pixels>
<Extensions>
};
注释:
1)第一行是C语言里的注释。这个是XPM文件的MAGIC标识。用来识别这是一个保存XPM格式的位图数据。LINUX下使用后缀名和文件MAGIC(文件内容的前几个字节)来判断文件类型。这比WINDOWS下要严密一点。
2)<Values>格式如下
<width><height><numcolors><cpp> [ <x_hotspot><y_hotspot> ] [ XPMEXT ]
<width>表达图像的宽,<height>表达图像的高,<numcolors>图像的颜色映射,<cpp>一个颜色用几个ASCII表示,即characters per pixel。<x_hotspot><y_hotspot>表示热点的坐标,可选。XPMEXT表示是否有扩展数据,即<Extensions>是否有数据。
3)<Colors>格式如下
<character> { <key> <color> } { <key> <color> }
<character>用来表示像素的字符。字符个数由cpp的值指定。
{ <key> <color> } 用来表示颜色类型和颜色值。key指定颜色类型,如单色,彩色等。color可以是RGB值也可以是HSV值等。
4)<Pixels>位图的颜色数据。直接用3)中定义的<character>来表达。这应该就是传说的ASCII艺术的前身吧。呵呵。

示例:

static char * plaid[] =
{


"4 4 4 2 0 0 XPMEXT",

c red m white s light_color",
"Y  c green m black s ines_in_mix",
"+  c yellow m white s lines_in_dark ",
"x  m black s dark_color ",

"x x x x ",
"x   x Y ",
"x + x x ",
"Y x x + ",
"XPMEXT ext1 data1",
"XPMEXT ext2",
"data2_1",
"data2_2",
"XPMEXT ext3",
"data3",
"XPMEXT",
"data4",
"XPMENDEXT"
};
解释:上例中表达的是一个4X4的小图像。这个数据结构和WINDOWS下的BITMAP结构非常类似。XPM在X系统中的地位与BITMAP在WINDOWS中的地位应该是相当的。

三)GDK中相关API
GDK中GdkBitmap用来表示单色位图,GdkPixmap用来表示多彩色位图。当GdkPixmap颜色深度为1时表示的即是单色位图。
相关API如下:
从XBM数据创建一个GdkBitmap对象。
GdkBitmap* gdk_bitmap_create_from_data (GdkDrawable *drawable, const gchar *data, gint width, gint height);

从XPM数据创建一个GdkPixmap对象。
GdkPixmap* gdk_pixmap_create_from_xpm (GdkDrawable *drawable, GdkBitmap **mask, const GdkColor *transparent_color, const gchar *filename);
有了GdkDrawable对象,即可画到窗口或者其它GdkDrawable对象上。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多