ico文件的數(shù)據(jù)結(jié)構(gòu)_第1頁(yè)
ico文件的數(shù)據(jù)結(jié)構(gòu)_第2頁(yè)
ico文件的數(shù)據(jù)結(jié)構(gòu)_第3頁(yè)
ico文件的數(shù)據(jù)結(jié)構(gòu)_第4頁(yè)
ico文件的數(shù)據(jù)結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

./1.制造原理

調(diào)色板模式的ico文件的數(shù)據(jù)結(jié)構(gòu),可分為6部分:

1.ICON文件頭〔6字節(jié)〕

2.ICON圖象信息塊〔16字節(jié)〕

3.BMP信息頭〔40字節(jié)〕

4.調(diào)色板〔16色為64字節(jié),256色為1024字節(jié)〕

5.XOR位圖

6.AND位圖而調(diào)色板模式的bmp文件的數(shù)據(jù)結(jié)構(gòu)可分為4部分:

1.BMP文件頭〔14字節(jié)〕

2.BMP信息頭〔40字節(jié)〕

3.調(diào)色板〔16色為64字節(jié),256色為1024字節(jié)〕

4.XOR位圖分析可知,ico圖標(biāo)與bmp位圖有三個(gè)相同的部分〔注:真彩圖標(biāo)與真彩位圖的數(shù)據(jù)結(jié)構(gòu)

均沒有調(diào)色板部分,所以是兩個(gè)相同的部分〕,而且這三個(gè)部分是最重要的部分。因此,我

們只要去掉bmp位圖的BMP文件頭,再加上ICON文件頭、ICON圖象信息塊和AND位圖,就可

以輕松制作出255×255象素以內(nèi)的任何規(guī)格的圖標(biāo)了。然而……且慢,有一點(diǎn)卻是很不輕松

的:如果你想制作背景透明〔屏蔽背景色〕的圖標(biāo),那么你還需要對(duì)XOR位圖的數(shù)據(jù)動(dòng)大手

術(shù),更不輕松的是,AND位圖的數(shù)據(jù)也必須符合相應(yīng)的要求,這是相當(dāng)困難的;而制作有背

景色的圖標(biāo)的話,XOR位圖部分我們可以原封不動(dòng),AND位圖全是0,只要計(jì)算出它的長(zhǎng)度

來(lái)即可添加到XOR位圖數(shù)據(jù)的后面,這是很容易實(shí)現(xiàn)的。所以,下面我所講的,都是制作有

背景色的圖標(biāo)。

ICON文件頭結(jié)構(gòu)很簡(jiǎn)單,一共只有3個(gè)數(shù)據(jù)共6個(gè)字節(jié),我們要給其中的"資源類型"和

"圖象個(gè)數(shù)"2個(gè)數(shù)據(jù)均賦值為1。

ICON圖象信息塊有7個(gè)數(shù)據(jù)共16字節(jié),有5個(gè)數(shù)據(jù)要賦值:圖標(biāo)寬度、圖標(biāo)高度、顏色

計(jì)數(shù)、圖像數(shù)據(jù)塊的長(zhǎng)度、圖象數(shù)據(jù)塊相對(duì)于文件頭部的偏移量。要賦值的5個(gè)數(shù)據(jù)中,圖

象數(shù)據(jù)塊相對(duì)于文件頭部的偏移量是固定的,圖像數(shù)據(jù)塊的長(zhǎng)度需要計(jì)算,其余3個(gè)數(shù)據(jù)可

從BMP信息頭中獲得資料。

AND位圖的長(zhǎng)度必須根據(jù)從BMP信息頭中獲得的有關(guān)數(shù)據(jù)計(jì)算。

此外,還要更改BMP信息頭中的2個(gè)數(shù)據(jù):一個(gè)是圖象長(zhǎng)度數(shù)據(jù)〔要加上AND位圖的

長(zhǎng)度〕,另一個(gè)是圖像高度數(shù)據(jù)〔這只要簡(jiǎn)單地將原數(shù)據(jù)×2即可〕。

OK,一切都準(zhǔn)備好了,萬(wàn)事俱備,只欠東風(fēng),下面就讓東風(fēng)勁吹吧。2.編程

新建一個(gè)窗體,添加一個(gè)公用對(duì)話框,兩個(gè)圖片框,三個(gè)按紐。

窗體與圖片框的ScaleMode屬性均設(shè)為3,其中Picture1的Autosize屬性設(shè)為Ture。

按紐的屬性設(shè)置:

Command1:Caption=打開圖片

Command2:Caption=數(shù)據(jù)處理,Enabled=False

Command3:Caption=保存圖標(biāo),Enabled=False代碼如下:OptionExplicitDimpDAT<>AsByte'源圖數(shù)據(jù)

DimaDAT<>AsByte'AND位圖數(shù)據(jù)

DimiDAT<>AsByte'icon文件頭和圖象信息塊數(shù)據(jù)PrivateSubCommand2_Click<>

OnErrorGoTo100

DimdAsLong,cAsLong

DimaLengthAsLong'AND位圖長(zhǎng)度aLength=4*<pDAT<4>\32+Abs<<pDAT<4>Mod32>>0>>*pDAT<8>'計(jì)算AND位圖的長(zhǎng)度

ReDimaDAT<aLength-1>AsByte

ReDimiDAT<21>AsByte'給icon文件頭和icon圖象信息塊的元素賦值

iDAT<2>=1'資源類型

iDAT<4>=1'圖像個(gè)數(shù)

iDAT<6>=pDAT<4>'圖像寬

iDAT<7>=pDAT<8>'圖像高

iDAT<8>=16*Abs<pDAT<14>=4>

iDAT<18>=22'圖象數(shù)據(jù)塊相對(duì)于文件頭部的偏移量'更改BMP信息頭中的圖像高度數(shù)據(jù)

d=2*pDAT<8>

SelectCaseLen<Hex<d>>

Case1,2:pDAT<8>=d

Case3,4:pDAT<9>=d\256:pDAT<8>=dAnd255

EndSelect'更改BMP信息頭中的圖象長(zhǎng)度數(shù)據(jù)

c=pDAT<21>:d=pDAT<20>+c*256+pDAT<22>*65536+aLength

SelectCaseLen<Hex<d>>

Case1,2:pDAT<20>=d

Case3,4:pDAT<21>=d\256:pDAT<20>=dAnd255

Case5,6:c=dAnd65535:pDAT<22>=d\65536:pDAT<21>=c\256:pDAT<20>=cAnd255

EndSelect'計(jì)算icon圖像信息塊中的圖象長(zhǎng)度數(shù)據(jù)

SelectCasepDAT<14>'pDAT<14>=4為16色,=8為256色,=24為真彩

Case4:d=d+40+64'64是16色調(diào)色板長(zhǎng)度,40是BMP信息頭的長(zhǎng)度

Case8:d=d+40+1024'1024是256色調(diào)色板長(zhǎng)度

Case24:d=d+40

EndSelect

SelectCaseLen<Hex<d>>

Case1,2:iDAT<14>=d

Case3,4:iDAT<15>=d\256:iDAT<14>=dAnd255

Case5,6:c=dAnd65535:iDAT<16>=d\65536:iDAT<15>=c\256:iDAT<14>=cAnd255

EndSelectCommand3.Enabled=True:Command2.Enabled=False

100

EndSubPrivateSubCommand1_Click<>

OnErrorGoToReadErr

DimImageNameAsString,fLengthAsLong,BJAsBoolean

WithCommonDialog1

.DialogTitle="打開"

.Filter="圖片文件<*.bmp,*.jpg,*.gif>|*.bmp;*.jpg;*.gif"

.ShowOpen

IfLen<.FileName><5ThenExitSub

ImageName=.FileName

EndWith

Picture1.Picture=LoadPicture<ImageName>

Picture2.Width=Picture1.Width:Picture2.Height=Picture1.Height

Picture2.Picture=LoadPicture<>

IfRight<LCase<ImageName>,3><>"bmp"Then'如果不是位圖,先存為位圖,再讀取

BJ=True

ImageName=App.Path&"\TempFile.bmp"

SavePicturePicture1.Image,ImageName

EndIf

fLength=FileLen<ImageName>'獲取文件長(zhǎng)度

ReDimpDAT<fLength-15>AsByte

OpenImageNameForBinaryAs#1

Get#1,15,pDAT

Close

IfBJThenKillImageName'刪除臨時(shí)位圖文件

If<pDAT<5>+pDAT<6>+pDAT<7>+pDAT<9>+pDAT<10>+pDAT<11>>0>Then

MsgBox"圖片尺寸超出"

ExitSub

EndIf

Me.Caption=ImageName

Command2.Enabled=True

ExitSub

ReadErr:

Close

EndSubPrivateSubCommand3_Click<>

OnErrorGoToWriteErr

DimIconNameAsString

WithCommonDialog1

.Flags=&H802

.DialogTitle="保存"

.Filter="圖標(biāo)文件<*.ico>|*.ico"

.ShowSave

If.FileName=""ThenExitSub

IconName=.FileName

EndWith

OpenIconNameForBinaryAs#1

Put#1,,iDAT

Put#1,,pDAT

Put#1,,aDAT

Close

ReDimiDAT<0>

ReDimpDAT<0>

ReDimaDAT<0>

Command3.Enabled=False

Picture2.Picture=LoadPicture<IconName>

ExitSub

WriteErr:

Close

MsgBox"圖標(biāo)制作失敗"

EndSub3.代碼分析

①在Command1_Click過(guò)程中,使用二進(jìn)制讀入數(shù)據(jù)方法,從第15字節(jié)讀起,這樣就去掉了

BMP文件頭。②在Command3_Click過(guò)程中,使用二進(jìn)制寫入數(shù)據(jù)方法,將ICON文件頭、ICON圖象信息塊

、讀入的位圖數(shù)據(jù)〔修改了其中幾個(gè)字節(jié)的數(shù)據(jù)〕、AND位圖數(shù)據(jù)〔全0數(shù)據(jù)>等,依次寫入一

個(gè)ico文件③Command2_Click過(guò)程是本代碼關(guān)鍵的關(guān)鍵。

首先計(jì)算AND位圖的長(zhǎng)度。這就需要知道掃描線的長(zhǎng)度和圖象的高度,而計(jì)算掃描線長(zhǎng)度

還需知道圖像的寬度。本代碼中,圖像高度在原位圖數(shù)據(jù)的pDAT<8>元素中,圖象寬度在原位

圖數(shù)據(jù)的pDAT<4>元素中,所以可歸納成代碼中所示的計(jì)算公式。接著給ICON文件頭和ICON圖象信息塊的元素賦值。請(qǐng)注意iDAT<6>和iDAT<7>,它們

分別是圖標(biāo)的寬度和高度,由于它們都只占用1個(gè)字節(jié),故圖標(biāo)規(guī)格的最大值只能做到255

象素〔如果它們都分別占用4個(gè)字節(jié)的話,呵呵,那制作出來(lái)的圖標(biāo)是多么地驚人??!〕。

icon圖像信息塊中的圖象長(zhǎng)度數(shù)據(jù)元素iDAT<14>—iDAT<17>要最后才賦值。接下來(lái)就是更改BMP信息頭中的圖像高度數(shù)據(jù)。原元素中只是XOR位圖的高度,而圖標(biāo)的

數(shù)據(jù)結(jié)構(gòu)要求這個(gè)值是XOR位圖高度與AND位圖高度之和。再修改BMP信息頭中的圖象長(zhǎng)度數(shù)據(jù)。原元素中只是XOR位圖的長(zhǎng)度,而圖標(biāo)的數(shù)據(jù)結(jié)

構(gòu)要求這個(gè)值是XOR位圖長(zhǎng)度與AND位圖長(zhǎng)度之和。最后修改icon圖像信息塊中的圖象長(zhǎng)度數(shù)據(jù),也就是iDAT<14>—iDAT<17>元素的值

〔這個(gè)長(zhǎng)度數(shù)據(jù)本來(lái)占用4個(gè)字節(jié),但255×255象素的圖標(biāo)長(zhǎng)度只要3個(gè)字節(jié)就夠了〕。計(jì)

算公式如下:icon圖像信息塊中的圖象長(zhǎng)度=XOR位圖長(zhǎng)度+AND位圖長(zhǎng)度+BMP信息頭長(zhǎng)度+調(diào)色板長(zhǎng)度

特大圖標(biāo)的制作工作到此就全部結(jié)束了,你一定迫不與待地想看看它的效果吧,可惜的

是,不論多大的圖標(biāo),在桌面或資源管理器中最大都只能顯示72×72的尺寸,你只有在圖片

框中才能欣賞到它的麗容了。不過(guò)不要垂頭喪氣,通過(guò)這個(gè)實(shí)驗(yàn),你將會(huì)獲得許多圖標(biāo)與位

圖的數(shù)據(jù)結(jié)構(gòu)方面的知識(shí),這不就是最大的收獲嗎?

附:圖標(biāo)文件的數(shù)據(jù)結(jié)構(gòu)之研究一、從圖標(biāo)的顯示原理說(shuō)起

一般圖標(biāo)都是由兩個(gè)單獨(dú)的位圖組成的。如果該圖標(biāo)是屏蔽背景色的話,那么,第一個(gè)

位圖是由黑色背景〔相關(guān)的顏色位全為0〕與彩色圖標(biāo)圖案組成的,該位圖將與當(dāng)前屏幕進(jìn)

行異或操作〔XOR〕,故稱其為XOR位圖;第二個(gè)位圖是由白色背景〔相關(guān)的顏色位全為1〕

與黑色圖標(biāo)圖案〔相關(guān)的顏色位全為0〕組成的,該位圖將與當(dāng)前屏幕進(jìn)行與操作〔AND〕,

故稱其為AND位圖。因此,圖標(biāo)的顯示是通過(guò)兩個(gè)步驟完成的:步驟1.首先,AND位圖與當(dāng)前屏幕進(jìn)行AND操作;

步驟2.接著,XOR位圖與當(dāng)前屏幕進(jìn)行XOR操作。大家知道,任何數(shù)值與1進(jìn)行AND操作的結(jié)果將等于原數(shù)值,而任何數(shù)值與0進(jìn)行AND

操作的結(jié)果則是0,因此在步驟1中,AND位圖中的背景色〔即白色1〕部分與屏幕經(jīng)過(guò)AND

操作后仍然保持屏幕的原色彩,而圖案色〔即黑色0〕部分則取代了原屏幕色。步驟1結(jié)束

后,屏幕上將留下一個(gè)黑色的圖標(biāo)圖案。在隨后的步驟2中,由于任何數(shù)值與0進(jìn)行異或操

作的結(jié)果都等于原數(shù)值,因此,XOR位圖與屏幕經(jīng)過(guò)異或操作后,彩色圖案部分就取代了屏

幕上的黑色圖標(biāo)部分,而屏幕的背景色與XOR位圖中的黑色背景0異或后仍保持原來(lái)的屏幕

色。步驟2結(jié)束后,一個(gè)以屏幕色為背景的彩色圖標(biāo)圖案就出現(xiàn)在屏幕上了〔這也是我們通

常所說(shuō)的"屏蔽背景色"或者說(shuō)"背景色透明"〕,這就是圖標(biāo)顯示的原理。二、圖標(biāo)的圖形

圖標(biāo)的圖形,實(shí)際上就是位圖格式的圖片,是一個(gè)標(biāo)準(zhǔn)的位圖格式。Windows只要從BMP

信息頭中獲取信息就足夠了,它據(jù)以解釋在其后出現(xiàn)的數(shù)據(jù)應(yīng)該如何處理。如果是調(diào)色板模

式,BMP信息頭后面的數(shù)據(jù)包含有調(diào)色板和像素點(diǎn)顏色索引,如果是真彩模式,其后的數(shù)據(jù)

直接就是像素點(diǎn)的RGB顏色值。

調(diào)色板模式的位圖文件是由BMP文件頭、BMP信息頭、調(diào)色板、數(shù)據(jù)區(qū)〔又稱位圖點(diǎn)陣〕

等幾個(gè)部分組成的。

而調(diào)色板模式的圖標(biāo)文件是由ICON文件頭、ICON圖像信息塊、BMP信息頭、調(diào)色板、數(shù)

據(jù)區(qū)〔這個(gè)數(shù)據(jù)區(qū)比位圖的數(shù)據(jù)區(qū)多了AND位圖的數(shù)據(jù),后面會(huì)講到〕。

我們欣喜地看到,位圖與圖標(biāo)的數(shù)據(jù)結(jié)構(gòu)有很大一部分是相同的!了解了這一情況,我

們可以簡(jiǎn)單地把圖標(biāo)圖形的結(jié)構(gòu)理解為位圖信息。這樣,我們就有可能根本不需要真的去畫

一幅圖來(lái)制作圖標(biāo),而只需要利用已有的位圖,對(duì)關(guān)鍵數(shù)據(jù)進(jìn)行程序填充或修改就可以了,

所編寫的代碼,直接按圖標(biāo)格式的要求,可把一個(gè)尺寸不大于255×255像素的任意位圖,

封裝成標(biāo)準(zhǔn)格式的圖標(biāo)〔位圖的寬高尺寸保持不變〕。

三、圖標(biāo)的數(shù)據(jù)結(jié)構(gòu)

圖標(biāo)文件的數(shù)據(jù)結(jié)構(gòu)可分為6部分,敘述如下:

順號(hào)名稱長(zhǎng)度〔單位:字節(jié)〕說(shuō)明

1ICON文件頭6

2ICON圖象信息塊16有多少個(gè)圖像,則信息塊也有多少個(gè)

3BMP信息頭40

4XOR位圖調(diào)色板16色=64,256色=1024真彩圖標(biāo)從此開始像素點(diǎn)的RGB值

5XOR位圖以調(diào)色板的索引值形式表示

6AND位圖以單色表示

說(shuō)明:

1.上表中的3-6部分合稱圖像數(shù)據(jù)塊,其中5、6部分又合稱為圖像數(shù)據(jù)區(qū)〔也稱位圖點(diǎn)陣〕

2.不論何種規(guī)格的圖標(biāo),其1-3部分的字節(jié)長(zhǎng)度是固定的。

3.調(diào)色板是供XOR位圖使用的,所以又稱作XOR位圖調(diào)色板。AND位圖是不需要調(diào)色板的,因

為它是單色的,即只有黑色和白色,所以又稱作單色AND位圖。

4.請(qǐng)注意第2部分的圖象信息塊的說(shuō)明,"有多少個(gè)圖像"是什么意思呢?原來(lái),在一個(gè)圖

標(biāo)文件中,有可能存放幾個(gè)圖像〔windows圖標(biāo)最多可有8個(gè)圖像〕,但每個(gè)圖像都有自己

的BMP信息頭、調(diào)色板、XOR位圖和AND位圖,且它們的圖像大小也可能不相同。以16

色有3個(gè)圖像的圖標(biāo)為例,其數(shù)據(jù)結(jié)構(gòu)如下:

順號(hào)名稱長(zhǎng)度〔字節(jié)〕說(shuō)明

1文件頭

6

2圖象1的圖象信息塊

16

3圖象2的圖象信息塊

16

4圖象3的圖象信息塊

16

5圖象1的圖象數(shù)據(jù)塊

不定其中BMP信息頭和調(diào)色板固定為40和64字節(jié)

6圖象2的圖象數(shù)據(jù)塊

不定同上

7圖象3的圖象數(shù)據(jù)塊

不定同上

下面以內(nèi)含1個(gè)圖像、16色、16×16規(guī)格的圖標(biāo)為例詳述〔偏移量括號(hào)前為10進(jìn)制,括

號(hào)內(nèi)為16進(jìn)制〕:

偏移量字節(jié)數(shù)描述典型值〔16進(jìn)制〕

〔一、文件頭6字節(jié)〕

000〔000〕2保留的字節(jié)0000

002〔002〕2資源類型0100〔01為圖標(biāo),02為光標(biāo)〕

004〔004〕2圖象個(gè)數(shù)0100

〔二、圖像信息塊16字節(jié)〕

006〔006〕1圖標(biāo)寬度10

007〔007〕1圖標(biāo)高度10

008〔008〕1顏色計(jì)數(shù)10〔16色,02=單色,00=256色或真彩>

009〔009〕1未用00

010〔00A〕4保留的00000000

014〔00E〕4圖象數(shù)據(jù)塊的長(zhǎng)度

28010000〔10進(jìn)制=296〕

018〔012〕4圖象數(shù)據(jù)塊相對(duì)于文件頭部的偏移量16000000〔10進(jìn)制=22〕

〔三、BMP信息頭40字節(jié)〕

022〔016〕4BMP信息頭結(jié)構(gòu)長(zhǎng)度28000000〔10進(jìn)制=40〕

026〔01A〕4圖像寬度10000000

030〔01E〕4圖像高度〔XOR圖高度+AND圖高度〕20000000

034〔022〕2位面板數(shù)

0100

036〔024〕2每象素所占位數(shù)

0400〔04=16色,8=256色,18=真彩>

038〔026〕4象素?cái)?shù)據(jù)的壓縮類型00000000〔表示未壓縮〕

042〔02A〕4位圖點(diǎn)陣的長(zhǎng)度C0000000〔10進(jìn)制=192〕

046〔02E〕16未用16個(gè)00.

〔四、XOR位圖的調(diào)色板64字節(jié)〕

062〔03E〕1藍(lán)色分量

063〔03F〕1綠色分量

064〔040〕1紅色分量

065〔041〕1未用00

……

〔五、XOR位圖的數(shù)據(jù)128字節(jié)〕

126〔07E〕128XOR位圖

〔六、單色AND位圖的數(shù)據(jù)64字節(jié)〕

254〔0FE〕64AND位圖

說(shuō)明:

1.上表中有關(guān)長(zhǎng)度的數(shù)據(jù),遵循"低位在前,高位在后"的原則。如果有4個(gè)字節(jié),那么后2

個(gè)字節(jié)為高位,前2個(gè)字節(jié)為低位,并且每2個(gè)字節(jié)內(nèi)也是"低位在前,高位在后"。例如

偏移量為00E的圖象數(shù)據(jù)塊的長(zhǎng)度是28010000,在計(jì)算時(shí)要把它們反過(guò)來(lái),變成0000

0128,實(shí)際就是16進(jìn)制的128即10進(jìn)制的296;再如12345678,那么實(shí)際計(jì)算時(shí)就是:

78563412,即10進(jìn)制的2018915346

2.偏移量為024的"每象素所占位數(shù)"是指象素在XOR位圖中所占的字節(jié)位數(shù)〔1個(gè)字節(jié)=8位〕

,04表示每個(gè)象素占4位,換言之,就是說(shuō)XOR位圖中每個(gè)字節(jié)可表示2個(gè)象素。該數(shù)據(jù)如為

0100,則表示單色〔黑白位圖〕,0400為16色,0800為256色,1800為24位真彩。

3.XOR位圖每字節(jié)對(duì)應(yīng)2個(gè)像素<16色>或1個(gè)像素<256色>,它的排列規(guī)律是:倒向〔最末行的

像素在最前,而第一行的像素在最后,由此類推〕,行內(nèi)像素按從左至右的順序,字節(jié)高

位表示靠左的像素。AND位圖每字節(jié)對(duì)應(yīng)8個(gè)象素〔每位對(duì)應(yīng)1個(gè)象素〕,排列規(guī)律與XOR位

圖相同。

4.真彩圖標(biāo)沒有調(diào)色板,而是在第3部分BMP信息頭的后面直接存放像素的RGB值,24位

真彩圖標(biāo)每3個(gè)字節(jié)對(duì)應(yīng)1個(gè)像素值,其中每個(gè)字節(jié)分別對(duì)應(yīng)該像素的R、G、B值。像素的

排列規(guī)律與調(diào)色板模式的圖標(biāo)相同。

5.上表的第一、二、三部分中,凡字節(jié)數(shù)為1的數(shù)據(jù),其數(shù)據(jù)類型為Byte,字節(jié)數(shù)為2的數(shù)據(jù),

其數(shù)據(jù)類型為Integer,字節(jié)數(shù)為4的數(shù)據(jù),其數(shù)據(jù)類型為L(zhǎng)ong〔第三部分中有16個(gè)未用的

的字節(jié),是4個(gè)Long類型的數(shù)據(jù),它們?cè)?bmp位圖中是有作用的〕。下面是各種圖標(biāo)〔內(nèi)含1個(gè)圖像〕的調(diào)色板、圖像數(shù)據(jù)的長(zhǎng)度與總長(zhǎng)度,括號(hào)內(nèi)是起始字

節(jié)的偏移量:

單位:字節(jié)

圖標(biāo)規(guī)格調(diào)色板XOR位圖AND位圖總長(zhǎng)度

16色16×16象素<62>64<126>128<254>64

318

16色24×24象素<62>64<126>288<414>96

510

16色32×32象素<62>64<126>512<638>128766

16色48×48象素<62>64<126>1152<1278>3841662

256色16×16象素<62>1024<1086>256<1342>641406

256色24×24象素<62>1024<1086>576<1662>961758

256色32×32象素<62>1024<1086>1024<2110>1282238

256色48×48象素<62>1024<1086>2304<3390>3843774

真彩16×16象素

<62>768<830>64

894

真彩24×24象素

<62>1728<1790>961886

真彩32×32象素

<62>3072<3134>1283262

真彩48×48象素

<62>6912<6974>3847358

說(shuō)明:

1.XOR位圖的長(zhǎng)度與圖標(biāo)尺寸與圖標(biāo)的顏色數(shù)均有關(guān),AND位圖的長(zhǎng)度只與圖標(biāo)的尺寸有關(guān),

與圖標(biāo)的顏色數(shù)無(wú)關(guān)。

2.XOR位圖每字節(jié)對(duì)應(yīng)2個(gè)像素〔16色〕或1個(gè)像素〔256色〕

3.AND位圖每4字節(jié)為一組〔這里所說(shuō)的"一組",其標(biāo)準(zhǔn)名稱為"一條掃描線",掃描線的

定義是:位圖中的一行數(shù)據(jù)信息叫做一條掃描線〕,但48×48圖標(biāo)的AND位圖每8個(gè)字節(jié)

為一組。組內(nèi)每個(gè)顏色位對(duì)應(yīng)1個(gè)象素。注意:

①16×16圖標(biāo)每組的后2個(gè)字節(jié)不用,所以實(shí)際上是2字節(jié)〔16位〕對(duì)應(yīng)一行16個(gè)象素

②24×24圖標(biāo)每組的最后1個(gè)字節(jié)不用,所以實(shí)際上是3字節(jié)〔24位〕對(duì)應(yīng)一行24個(gè)象素

③32×32圖標(biāo)每組4個(gè)字節(jié)32位對(duì)應(yīng)一行32個(gè)象素

④48×48圖標(biāo)每組的后2個(gè)字節(jié)不用,所以實(shí)際上是6字節(jié)〔48位〕對(duì)應(yīng)一行48個(gè)象素

4.為什么位圖數(shù)據(jù)中會(huì)有不用的字節(jié)呢,這不是浪費(fèi)嗎?原來(lái),Windows有一個(gè)規(guī)定,每一

條掃描線必須結(jié)束于一個(gè)32位的邊界,也就是說(shuō),一條掃描線的位長(zhǎng)度〔按位計(jì)算〕必須

能整除32,或字節(jié)長(zhǎng)度必須能整除4〔XOR、AND位圖都是如此〕。舉例來(lái)說(shuō),如果一條掃

描線只有8位,那么就要用空白的24位來(lái)補(bǔ)充,如果有48位,那么還必須用空白的16位來(lái)

補(bǔ)充。

5.XOR位圖每條掃描線長(zhǎng)度取決于兩個(gè)因素:圖像的寬度值和顏色數(shù)。各種顏色的圖標(biāo)的XOR

位圖每條掃描線的長(zhǎng)度如下表所示〔單位:字節(jié)〕:①16色圖標(biāo):

XOR圖象寬度掃描線長(zhǎng)度

16象素8

17--24象素12

25--32象素16

33--40象素20

41--48象素24

49--56象素28

57--64象素32

65--72象素36

71--80象素40

……

可以歸納出計(jì)算公式是:

16色XOR位圖每條掃描線長(zhǎng)度=4×〔圖象寬\8+Abs〔〔圖象寬Mod8〕>0〕〕②256色圖標(biāo):

XOR圖象寬度掃描線長(zhǎng)度

16象素16

17--20象素20

21--24象素24

25--28象素28

29--32象素32

33--36象素36

37--40象素40

41--44象素44

45--48象素48

……

可以歸納出計(jì)算公式是:

256色XOR位圖每條掃描線長(zhǎng)度=4×〔圖象寬\4+Abs〔〔圖象寬Mod4〕>0〕〕③真彩圖標(biāo):

XOR圖象寬度掃描線長(zhǎng)度

16象素48

17象素52

18象素56

19象素60

20象素

60

21象素64

22象素68

23象素72

24象素72

……

可以歸納出計(jì)算公式是:

真彩XOR位圖每條掃描線長(zhǎng)度=4×〔圖象寬×3\4+Abs〔〔圖象寬×3Mod4〕>0〕〕6.AND位圖每條掃描線的長(zhǎng)度只與圖標(biāo)圖像的寬度值有關(guān)。如下表所示〔單位:字節(jié)〕:

AND圖象寬度掃描線長(zhǎng)度

16--32象素4

33--64象素8

65--96象素12

97--128象素16

129--160象素20

160--192象素24

192--224象素28

224--255象素32

可以歸納出計(jì)算公式是:

AND位圖每條掃描線長(zhǎng)度=4×〔圖象寬\32+Abs〔〔圖象寬Mod32〕>0〕〕7.要使背景透明,XOR位圖的背景必須為黑色〔對(duì)應(yīng)的顏色位=0〕,圖案為彩色,而AND位

圖則背景必須為白色〔對(duì)應(yīng)的顏色位=1〕,圖案為黑色〔對(duì)應(yīng)的顏色位=0〕

8.XOR位圖的彩色圖形信息中存儲(chǔ)的并不是顏色值,而是與調(diào)色板對(duì)應(yīng)的索引值,從0開始

編號(hào)。

四、圖標(biāo)的顏色

調(diào)色板模式的圖標(biāo),其顏色是由調(diào)色板確定的,而調(diào)色板是可以自行定義的。比如16色

圖標(biāo),其調(diào)色板只要有16種顏色就行。下面是以QBasic的16種顏色作為調(diào)色板時(shí),XOR位

圖調(diào)色板的16色索引值與QBColor的顏色值對(duì)照:

顏色索引值QBasic調(diào)色板中的值〔最后一個(gè)字節(jié)未用〕

黑色0

0

000000

00

深紅1

4

000080

00

深綠2

2

008000

00

深黃3

6

008080

00

深藍(lán)4

1

800000

00

深紫5

5

800080

00

深青6

3

808000

00

深灰7

8

808080

00

淺灰

8

7

C0C0C0

00

紅色9

C<12>0000FF

00

綠色A<10>

A<10>00FF00

00

黃色B<11>

E<14>00FFFF

00

藍(lán)色C<12>

9

FF0000

00

紫色D<13>

D<13>FF00FF

00

青色E<14>

B<11>FFFF00

00

白色F<15>

F<15>FFFFFF

00

怎么個(gè)對(duì)應(yīng)法呢?舉個(gè)例來(lái)說(shuō),比如16×16象素圖標(biāo)的XOR位圖中某個(gè)字節(jié)值為81,那

就表示該字節(jié)所對(duì)應(yīng)的2個(gè)象素,左邊的象素為淺灰色而右邊的象素為深紅色。五、一個(gè)具體的例子

有一個(gè)16色16×16象素的圖標(biāo),該圖標(biāo)是一個(gè)邊長(zhǎng)為16、邊框?yàn)榧t色的空心正方形,其

全部數(shù)據(jù)如下:

偏移量000102030405060708090A0B0C0D0E0F

000

00000100010010101000000000002801

010

00001600000028000000100000002000

020

00000100040000000000C00000000000

030

00000000000000000000000000000000

040

00000000800000800000008080008000

050

0000800080008080000080808000C0C0

060

C0000000FF0000FF000000FFFF

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論