用Delphi實現(xiàn)24位真彩色圖標本文詳細介紹了ICO文件的格式,以及利用Jpeg、BMP等格式的24位真彩色圖片,生成圖標的一種方法 引言
delphi是目前廣泛使用的可視化開發(fā)工具,它自身帶有一個圖片、圖標的編輯器——Image Editor,但是到delphi7為止,都不能進行真彩圖標的編輯,可以說是一個遺憾。筆者通過對圖標文件的研究,實現(xiàn)了產(chǎn)生24位真彩色圖標。 圖標文件的格式 首先,分析一個具體的圖標 。在CS1.6中有一個圖標game.ico( ),如果用WinHex等可以進行16進制編輯的軟件打開這個圖標文件,我們可以看到如下數(shù)據(jù): 00 00 01 00 04 00 10 10 00 00 00 00 00 00 68 05 00 00 46 00 00 00 10 10 00 00 00 00 00 00 68 03 00 00 AE 05 00 00 20 20 00 00 00 00 00 00 A8 08 00 00 16 09 00 00 20 20 00 00 00 00 00 00 A8 0C 00 00 BE 11 00 00 28 00 00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00 00 00 40 01 00 00 47 46 6C 65 6D 69 6E 67 00 01 00 00 00 00 00 00 00 00 下面我們就說一說,這些數(shù)據(jù)的具體含義。一個圖標文件(*.ICO),實際上可以含有多個圖標.通常,每個圖標都會被轉(zhuǎn)換為針對特定顯示設備的圖標圖像。圖標文件由文件頭和數(shù)據(jù)組成, ICO文件一開始,是一個叫做tagIconDir的記錄型的結(jié)構(gòu),在delphi中這樣來描述(括號內(nèi)的數(shù)值,是針對CS圖標的具體數(shù)據(jù)):
這個記錄中的idEntries 是個數(shù)組結(jié)構(gòu),這個結(jié)構(gòu)的大小不是始終為 1 的一個數(shù)組,它需要根據(jù)圖標數(shù)目 ( idCount ) 來確定真實的數(shù)組大小。它的類型為tagIconDirEntry記錄,定義如下:
上面說的idCount 表示圖標文件里包含的圖標個數(shù),每個圖標都要有一個tagIconDirEntry結(jié)構(gòu)來表示圖標的具體信息。根據(jù)本結(jié)構(gòu)的dwBytesInRes和dwImageOffset我們就可以確定圖片(圖標)的位置了。在該位置的數(shù)據(jù)是一個稱為agIconImage的記錄,它是這樣定義的:
從這個定義中我們可以看出,這個內(nèi)容就是一個標準的位圖格式,只不過多了兩項,icXOR和icAND,普通的位圖信息里是沒有這2 個成員的。大家知道,圖標在被顯示時,是利用遮罩方法將 2 副位圖在同一個位置顯示才產(chǎn)生任意輪廓的,先使用 XOR 位 圖摳出需要顯示的區(qū)域,然后再在摳出的區(qū)域中顯示出需要顯示的圖形。由于這個緣故,圖標的位圖格式中的位圖信息頭 ( TBitmapInfoHeader ) 是 2 個位圖共用 的。它與普通位圖頭信息最大的不同是 TBitmapInfoHeader.biHeight 成員,顯然它是 2 副位圖高度的總和。講到這里,我們需要對位圖(BMP)文件的格式有些了解了。 位圖文件的格式 BMP文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成。按照微軟的定義,在開始的文件頭由14個字節(jié)組成:
緊接著上一記錄的是位圖信息頭tagBITMAPINFOHEADER,BMP位圖信息頭數(shù)據(jù)用于說明位圖的尺寸等信息。這個信息頭就是上文說的TBitmapInfoHeader,它的長度固定為40字節(jié)。
緊接著就是顏色表,用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結(jié)構(gòu),定義一種顏色。RGBQUAD結(jié)構(gòu)的定義如下:
顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個數(shù)有biBitCount來確定: 當biBitCount=1,4,8時,分別有2,16,256個表項; 當biBitCount=24時,沒有顏色表項。 位圖信息頭和顏色表組成位圖信息,BITMAPINFO結(jié)構(gòu)定義如下:
|
|