隨手扎
圖片格式-[XPM]
前言
之所以會去瞭解XPM,其一是這是我最早在一本與 C語言 相關書籍中看到解釋的圖片格式,基本上完全相融於C的語法,這意味著完全可以使用文字編輯器進行編輯。
同樣的PBM作爲一個可攜式的圖片格式,一樣有純文字版本。因此,特別去瞭解這兩個圖片格式。
Linux可能會對XPM檔案這麼描述:
X pixmap image, ASCII text
當然,他應該也有二進位格式吧….
XPM格式簡單說明
XPM正式全名為:X PixMap,自1989年發展起,歷經3個版本,第三個版本–XPM3完全相融於C語言的格式,這也是為什麼C語言書籍會拿它來說明,並當作事窗的icon範例程式。 不過又LAG於自己的電腦環境測試(LinuxMint 18.3),只有版本3能被作業系統正常識別(還有一點規則需求),版本1和版本2只會被認爲是純文本。不過3個版本都會略微提到。
XPM3
不耽誤大家時間,直接先來說說XPM3。XPM3完全相融於c語言的格式,其實只是一個靜態、不等長的二維字元陣列,或者直觀一點的說:是一個靜態一維字串陣列。記載內容分成三大部分:
- 圖片基礎資訊。 包含長、寬、顏色數量、每像素標記字元長度。
- 顏色標記約定
- 像素資料內容
舉例來說長成這樣:
/* XPM */
static char * XFACE[] = {
// 第一部分
// 圖片基礎資訊
"33 32 2 1", // 寬, 高, 顏色數量, 單位像素標記字元長度
// 第二部分
// 顏色標記約定
". c #ffffff", // 使用字元, 模式, 顏色
"* c #000000", // 模式可以是 c (color),並附加 m (monochrome), g (grayscale), s (symbolic)
// 像素資料內容
// 這應該就不用多說了吧´ ▽ ` )ノ
".................................",
".................................",
"..**.............................",
"..**.............................",
"..**.....................**..**..",
"..**...................********..",
"..**...................**..****..",
"..**..................**....***..",
"..**..................**....***..",
"..**...................**..****..",
"..**...................*********.",
"..**.....................**.****.",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..***................***....**...",
"..***................****...**...",
"..****.................**...**...",
"..*****................*******...",
"..****************************...",
"..****************************...",
".................................",
".................................",
};
不過要注意的是,最一開始還需要加一行註解去說明這是什麼檔案格式,也就是/* XPM */
這行,這有點類似#! /bin/bash
、HTTP/1.1
。恩…..可能很多人不同LAG在說什麼,不過很多檔案格式最一開始幾乎都會標明自己是甚麼類型的檔案。舉例來說HTTP封包你可能會看到:
HTTP/2.0 200 OK
date: Sun, 05 May 2019 01:18:33 GMT
content-type: text/html; charset=UTF-8
server: mw1332.eqiad.wmnet
在雙空行之前,都是HTTP的檔頭,其中第一行更是標註了 協定 、 版本 和 狀態碼 。(維基也已經是使用HTTP 2.0了呢~)
打開一個PNG檔案:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0028 0000 0028 0806 0000 008c feb8 ...(...(........
00000020:
或者會看到:
那開始的PNG
在明顯不過了吧?當然,你的作業系統,或是圖片瀏覽器可能是認副檔名(.xpm)的。那麼這行註解可能就無所謂,但這麼寫是個好習慣。
顏色標記約定
看完了基本格式,包含檔案註解、圖檔資訊、顏色標記約定、像素資料內容。我想其中還有必要多做說明的只剩下 顏色標記約定 的部分。
每個顏色標記約定都含有三個部分:
- 使用字元
- 模式
- 顏色
其中模式可以是 c (color),並且可以而外標註 m (monochrome), g (grayscale), 或 s (symbolic)。顏色可以用RGB的16進位表示,但注意不能簡寫(ex:白色不能只寫#fff
,一定要寫#ffffff
),亦可以使用color name。作業系統對於color name幾乎都有做些擴張,但如果想要更好的可攜,最好還是只使用標準的名字。此外,值的說明的是,color name可以用none
表示為透明像素。
所以上圖可以再改成:
/* XPM */
static char * XFACE[] = {
"33 32 2 1",
". c none",
"* c medium blue",
".................................",
".................................",
"..**.............................",
"..**.............................",
"..**.....................**..**..",
"..**...................********..",
"..**...................**..****..",
"..**..................**....***..",
"..**..................**....***..",
"..**...................**..****..",
"..**...................*********.",
"..**.....................**.****.",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..**........................**...",
"..***................***....**...",
"..***................****...**...",
"..****.................**...**...",
"..*****................*******...",
"..****************************...",
"..****************************...",
".................................",
".................................",
};
備註: 雖然又LAG的圖片顯示器無法識別
none
,造成顯示錯誤。 但是用其他繪圖軟體開起來是正常的。
XPM1 和 XPM2
關於版本1和版本2,我們直接來看看維基百科上的範例:
XPM1
#define test_width 16
#define test_height 7
static char test_bits[] = {
0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,
0x00, 0x60 };
可以看到需要而外的巨集去標註長寬,甚至前綴(prefix-test_
)、資料類型(bits
, colors
or pixels
)都要而外注意。
XPM2
! XPM2
48 4 2 1
a c #FFFFFF
b c #000000
abaabaababaaabaabababaabaabaababaabaaababaabaaab
abaabaababaaabaabababaabaabaababaabaaababaabaaab
abaabaababaaabaabababaabaabaababaabaaababaabaaab
abaabaababaaabaabababaabaabaababaabaaababaabaaab
XPM2和PBM有些像,基本上也和XPM3很像,就只是去掉了關於C的部分,只留下資料。這邊也就不多做說明。
題外話
XPM1和XPM2,又LAG所使用的圖片瀏覽器都無法正常瀏覽。愛用的繪圖軟體也無法開啓這兩個版本的檔案。
但是, GIMP可以開啓XPM2。而XPM1可能因爲沒有標註檔案類型的關係,無法開啓。
而最厲害的是, emacs,全都能辨識。不管是XPM1、XPM2還是XPM3在emacs都是正常的。
再來看看emacs裡面自帶的artist-mode(藝術家模式):
純文字還能這麼玩呢~