第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程式預設選項
的結構。