第14章 定义和使用位元映像
一个位元映像是一个小图,说得更清楚一点,一个图的显现是由像素组成,
而像素又是由一个位元来对应,当位元为”1 ”时,像素为”黑色”,而当位
元为”0 ”时,像素为”白色”。X有许多的公用程式来管理位元映像,你可
以用不同的方法来建立、编辑和储存它们。有一些使用者程式允许你直接使用
它们。(其它大部份的程式则以内部的形式使用它们,这些公用程式大都放在
X程式库中,使得使用者撰写程式时很容易便可加以运用。)
本章开始先描述位元映像的工具,接下来实际使用xsetroot程式,它可以
让你定制你的萤幕,设定一个位元映像的背景,选择你的色彩和指定一个位元
映像当作游标来使用。
14.1 系统位元映像程式馆
位元映像档案的程式馆被当作系统的一部份提供给你,预设储存在这个目
录:
/usr/include/x11/bitmaps
但在你的工作站上或许不同,问一下你的系统的装置者,我们将以此目录为准,
并用其中的一些档案作为本章的□例。
14.2 交谈式地编辑一个位元映像 -- bitmap
bitmap程式是一个让你以交谈式建立或编辑位元映像的工具,它将位元映
像以方格子来表示,每一个格子代表一个像素,你可以用滑鼠设定或清除像素。
14.2.1 启动bitmap
透过bitmap你可以编辑一个包含有一个位元映像的档案,或从头开始建立
一个位元映像并将它储存为档案。不论是何者,当你启动bitmap时,你需要给
一个档案名称,不论是现存的档案或是新建的档案。
当建立一个新的位元映像时,你可以选择性地指定大小(宽度X 长度个像
素),如果你未指定,预设大小为16X16 。举例来说,假如我们想要建立一个
比较大一点的十字型数位映像,我们可以用下面的命令列:
bitmap big-cross 40X50 &
14.2.2 使用bitmap
假如我们要编辑一个现存的档案,可以用下面的命令列启动程式:
bitmap /usr/include/x11/bitmaps/cntr-ptr
则一个像图14-1的视窗出现在萤幕上,右下角以实际大小显示出目前位元映像
的状态,另一个则为反相(reverse) 的位元映像,其它在右边的”盒”你可以
用碰触滑鼠按钮的方式来操作它们。
用三钮滑鼠编辑图形最简单的方法:
设定像素:在一个像素上碰触滑鼠左按钮,或者是按住左按钮并拖拽它,
每一个经过的像素方格均会被设定,直到松开按钮为止。
清除像素:和上述相同的方法,但是以滑鼠右按钮代替。
反转(invert)像素:在一个像素上碰触滑鼠中按钮(也就是黑的像素被清
除而白的像素被设定),当你按住中按钮并拖拽,所经过的像
素格均会反转。
┌————————————————————┐
│ p160 fig 14.1 │
│ │
│ 图14-1 位元映像编辑器 │
└————————————————————┘
bitmap还有其它的面貌:如果你观察接近箭头的上端部份(见图14-2的
放大图),你可以在其中的一个方格中看到有一个小菱形,这代表了热点(hotspot)
,当bitmap被用来建造一个游标时会应用到:热点是游标真正动作的点。指向
型的游标,热点通常在顶端,而圆形或方形的游标,热点则在中心。(你可以
用Set Hot Spot和Clear Hot Spot两个命令来更改热点的位置或消去它)
当你结束了你的更改动作,可以用碰触Write Output将位元映像储存至档
案,但不会离开bitmap程式。
┌————————————————————┐
│ p161 fig 14.2 │
│ │
│ 图14-2 一个游标的”热点” │
└————————————————————┘
离开程式,碰触Quit,如果你编辑了位元映像却试图在未储存前离开程式,
你将会得到提示以确定你是否真要如此做。
14.2.3 画形状(shapes)
bitmap有数个功能使得画图更容易:
画一条线:碰触Line,游标会变成一个大黑点,在所欲画的线的一端碰触
一下按钮,而後在另一端也碰触一下,bitmap会画出这条线。
画一个中空的圆:碰触Circle,同样地,游标变成一个大黑点,在你所欲
画圆的圆心碰触一下,而後在所欲画圆之圆周上的任一点碰触
一下,bitmap将画出这个圆的圆周。
画一个填满的圆:碰触Filled Circle ,其馀同上。
14.2.4 在长方形的区域内工作
命令Clear Area、Set Area和Invert Area 必须在长方形区域下操作,长
方形区域的决定方式是你在它的左上角以按住滑鼠任意按钮的方式指定,然後
拖拽到右下角,当你拖拽时,目前被指定的区域会以高亮度显示。
你可以拷贝、移动或重叠(overlay) 一个区域,你以拖拽的方式指定原始
区域,而後在目标区域上的左上角碰触按钮,各种命令的动作如下:
拷贝(Copy):目标区域会被消除,而所有对应於原始区域为黑像素的
均会被设定。
移动(Move):原始区域和目标区域均被清除,目标区域对应於原始区
域为黑像素的均会被设定。
重叠(Overlay) :在目标区域中对应於原始区域被设定的像素均会被
设定,其它没有改变。
14.2.5 一个位元映像的档案格式
一个位元映像会如同ASCII 文字一样储存到档案中,其格式类似C 语言程
式片段。
例如:档案 /usr/include/X11/bitmaps/cntr_ptr 的内容:
#define cntr_ptr_width 16
#define cntr_ptr_height 16
#define cntr_ptr_x_hot 7
#define cntr_ptr_y_hot 1
static char cntr_ptr_bits[]=
0x00, 0x00, 0x80, 0x01, 0x80, 0x01,
0xc0, 0x03, 0xc0, 0x03, 0xe0, 0x07,
0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f,
0x98, 0x19, 0x88, 0x11, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x00, 0x00;
带有_x_hot和_y_hot的变数仅在热点被指定後才会包含进来。
更多的细节包含在bitmap(1) 的指南页中,不过无论如何,你毋需直接以
此种格式处理位元映像,任何你想要做的事均有工具程式来处理。
14.3 编辑位元映像其它的方法
bitmap程式对於一个小的图形工作起来算是相当方便,但它有一些缺点:
.它不接受较简单格式的输入档,例如像一些由扫描现存图形所产生的档案。
.它必需以交谈式执行,对一些程序性的编辑动作并不方便。
.你可能希望用它产生一些位元映像来显示,但它无法在非X系统上执行。
要克服上述的问题,需要以字元图(character picture) 的形式来建立位
元映像,并提供这个格式和bitmap的格式相互转换的程式。字元图格式是非常
明显的:每一行的像素用一行的字元来表示,黑的像素用一个指定的字元(预
设为# )而白的像素用另一个字元(预设为 -)表示,以cntr_ptr为例,字元
图的格式如图14-3
┌————————————————————┐
│ p164 fig 14.3 │
│ │
│ 图14-3 字元图格式的位元映像 │
└————————————————————┘
你能以本文编辑器或其它任何系统上任何其它合适的程式编辑这些图形,
也可以由扫描器(scanner) 或其它影像设备产生。
14.3.1 字元图和X位元映像间的转换
X提供了两个程式作字元图格式和位元映像格式间的转换:
atobm : 转换一个字元图为标准的位元映像。
bmtoa : 转换一个标准的位元映像为字元图。
两个程式均允许你指定以何字元来代表黑和白像素。
14.4 定制你的根视窗 -- xsetroot
xsetroot 让你设定你的根视窗的特徵,你可以改变视窗背景的颜色和图样(
pattern) ,以及视窗所使用的游标。
14.4.1 设定一个背景的位元图样
你可以指定任何位元映像来当作你萤幕的背景(只要它是X的标准格式)
, 在 xsetroot 的命令列上,-bitmap 选项跟随著位元映像的档案名称。例如:
xsetroot -bitmap /usr/include/X11/bitmaps/mensetmanus
会出现一个精致的背景(见图14-4)(拉丁语 Mens et Manus (mensetmanus)
是 MIT的箴言,两个人物的图形简单表现出 MIT的精神。)
┌————————————————┐
│ │
│ P165 Fig 14.4 │
│ │
│图14 - 4 设定 mensetmanus位元 │
│ 映像为背景图样的根视窗 │
└————————————————┘
14.4.2 设定一个背景游标
如果你不要使用预设的 "大的 X "游标,你可以用选项 -CURSOR 加上
cursorbitmap 和 maskbitmap两个引数来改变它,两个引数均为位元映像
档案的名称。例如:设定游标为前节所示的位元映像,使用命令:
xsetroot -cursor /usr/include/X11/bitmaps/cntr_ptr
/usr/include/X11/bitmaps/cntr_ptrmsk
位元映像的对照图见图14-5.
┌————————————————┐
│ │
│ P166 Fig 14.5 │
│ │
│图14 - 5 游标及其遮罩的位元映像 │
└————————————————┘
maskbitmap决定了cursorbitmap的哪些像素真正被显示出来:游标像素
中只有对应到遮罩像素(mask)为黑的部份才会用到,游标其它的像素不会
被显示出来。总结来说,遮罩决定了游标的外形,反之,游标位元映像则
决定了外形的颜色。遮罩和游标的位元映像必须大小相同。
这种遮罩结构在两种情况下非常有用:
1. 它允许 "乾净地" 显示出非长方形游标,而不需显示出多馀的空白。例如
如果没有遮罩,cntr_ptr会显示成一个 16 x 16白方形中有一个箭头,当你用
它指物件时,物件的一部份会被矩形外框遮盖住。
2. 适当地设定遮罩,你可以保证不论背景的颜色为何均能看得到游标。例如
cntr_ptrmsk 比 cntr_ptr 的边均大一个元素,所以游标周围围绕著一圈白边
。如果遮罩和游标大小相同的话,当游标在黑色的区域将会消失不见。
你可以让遮罩和游标使用相同的位元映像:游标的外形会如你所期望(因
为遮罩决定外形,而这外形正是你想要的),它们可以工作,但是当游标进入
和它相同颜色的区域时,你就很难看到游标了。实际上,并非所有在
/usr/include/X11/bitmaps中的位元映像均有相对应的遮罩,如果你使用它们
当作游标,你必须使用游标位元映像当作遮罩。
有兴趣的话,试一试把mensetmanus 当作游标和遮罩(热点是在左上角)。
14.4.3 其它的背景设定选项
你可以用命令列选项 -solid colour设定背景为单一颜色(在单色显示
器上只有黑色和白色)。你可以用 -grey或 -gray设定颜色的灰度,你也可以
用 -mod x y 设定格子图样,x 和 y为 1到16的整数。
14.4.4 重定预设的背景和游标
如果你不喜欢你既有的设定,你可以用下列两者之一恢复预设的游标和背
景:
xsetroot -def
xsetroot
14.5 总结
本章中,我们看到如何以交谈的方式编辑位元映像,如何储存它们,和如
何把它们与其它格式之间作转换以使它们能被那些非视窗系统程式处理。你可
以把位元映像和xsetroot连接在一起,以定制适合你自己口味的系统:用不同
的方法设定你根视窗的背景和变更游标。
下一章,我们继续来定制系统,并且来看一下你用以设定X程式预设选项
的结构。
标签: