青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

李錦俊(mybios)的blog

游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學(xué) 計算機(jī)圖形學(xué) SQL Server

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團(tuán)隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 372634
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

前言

PNG是20世紀(jì)90年代中期開始開發(fā)的圖像文件存儲格式,其目的是企圖替代GIF和TIFF文件格式,同時增加一些GIF文件格式所不具備的特性。流式網(wǎng)絡(luò)圖形格式(Portable Network Graphic Format,PNG)名稱來源于非官方的“PNG's Not GIF”,是一種位圖文件(bitmap file)存儲格式,讀成“ping”。PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,存儲彩色圖像時,彩色圖像的深度可多到48位,并且還可存儲多到16位的α通道數(shù)據(jù)。PNG使用從LZ77派生的無損數(shù)據(jù)壓縮算法。

PNG數(shù)據(jù)塊(Chunk)

PNG定義了兩種類型的數(shù)據(jù)塊,一種是稱為關(guān)鍵數(shù)據(jù)塊(critical chunk),這是標(biāo)準(zhǔn)的數(shù)據(jù)塊,另一種叫做輔助數(shù)據(jù)塊(ancillary chunks),這是可選的數(shù)據(jù)塊。關(guān)鍵數(shù)據(jù)塊定義了4個標(biāo)準(zhǔn)數(shù)據(jù)塊,每個PNG文件都必須包含它們,PNG讀寫軟件也都必須要支持這些數(shù)據(jù)塊。雖然PNG文件規(guī)范沒有要求PNG編譯碼器對可選數(shù)據(jù)塊進(jìn)行編碼和譯碼,但規(guī)范提倡支持可選數(shù)據(jù)塊。

下表就是PNG中數(shù)據(jù)塊的類別,其中,關(guān)鍵數(shù)據(jù)塊部分我們使用深色背景加以區(qū)分。

PNG文件格式中的數(shù)據(jù)塊
數(shù)據(jù)塊符號
數(shù)據(jù)塊名稱
多數(shù)據(jù)塊
可選否
位置限制
IHDR 文件頭數(shù)據(jù)塊 第一塊
cHRM 基色和白色點數(shù)據(jù)塊 在PLTE和IDAT之前
gAMA 圖像γ數(shù)據(jù)塊 在PLTE和IDAT之前
sBIT 樣本有效位數(shù)據(jù)塊 在PLTE和IDAT之前
PLTE 調(diào)色板數(shù)據(jù)塊 在IDAT之前
bKGD 背景顏色數(shù)據(jù)塊 在PLTE之后IDAT之前
hIST 圖像直方圖數(shù)據(jù)塊 在PLTE之后IDAT之前
tRNS 圖像透明數(shù)據(jù)塊 在PLTE之后IDAT之前
oFFs (專用公共數(shù)據(jù)塊) 在IDAT之前
pHYs 物理像素尺寸數(shù)據(jù)塊 在IDAT之前
sCAL (專用公共數(shù)據(jù)塊) 在IDAT之前
IDAT 圖像數(shù)據(jù)塊 與其他IDAT連續(xù)
tIME 圖像最后修改時間數(shù)據(jù)塊 無限制
tEXt 文本信息數(shù)據(jù)塊 無限制
zTXt 壓縮文本數(shù)據(jù)塊 無限制
fRAc (專用公共數(shù)據(jù)塊) 無限制
gIFg (專用公共數(shù)據(jù)塊) 無限制
gIFt (專用公共數(shù)據(jù)塊) 無限制
gIFx (專用公共數(shù)據(jù)塊) 無限制
IEND 圖像結(jié)束數(shù)據(jù) 最后一個數(shù)據(jù)塊

為了簡單起見,我們假設(shè)在我們使用的PNG文件中,這4個數(shù)據(jù)塊按以上先后順序進(jìn)行存儲,并且都只出現(xiàn)一次。

數(shù)據(jù)塊結(jié)構(gòu)

PNG文件中,每個數(shù)據(jù)塊由4個部分組成,如下:

名稱 字節(jié)數(shù) 說明
Length (長度) 4字節(jié) 指定數(shù)據(jù)塊中數(shù)據(jù)域的長度,其長度不超過(231-1)字節(jié)
Chunk Type Code (數(shù)據(jù)塊類型碼) 4字節(jié) 數(shù)據(jù)塊類型碼由ASCII字母(A-Z和a-z)組成
Chunk Data (數(shù)據(jù)塊數(shù)據(jù)) 可變長度 存儲按照Chunk Type Code指定的數(shù)據(jù)
CRC (循環(huán)冗余檢測) 4字節(jié) 存儲用來檢測是否有錯誤的循環(huán)冗余碼

CRC(cyclic redundancy check)域中的值是對Chunk Type Code域和Chunk Data域中的數(shù)據(jù)進(jìn)行計算得到的。CRC具體算法定義在ISO 3309和ITU-T V.42中,其值按下面的CRC碼生成多項式進(jìn)行計算:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

下面,我們依次來了解一下各個關(guān)鍵數(shù)據(jù)塊的結(jié)構(gòu)吧。

IHDR

文件頭數(shù)據(jù)塊IHDR(header chunk):它包含有PNG文件中存儲的圖像數(shù)據(jù)的基本信息,并要作為第一個數(shù)據(jù)塊出現(xiàn)在PNG數(shù)據(jù)流中,而且一個PNG數(shù)據(jù)流中只能有一個文件頭數(shù)據(jù)塊。

文件頭數(shù)據(jù)塊由13字節(jié)組成,它的格式如下表所示。

域的名稱
字節(jié)數(shù)
說明
Width 4 bytes 圖像寬度,以像素為單位
Height 4 bytes 圖像高度,以像素為單位
Bit depth 1 byte 圖像深度:
索引彩色圖像:1,2,4或8
灰度圖像:1,2,4,8或16
真彩色圖像:8或16
ColorType 1 byte 顏色類型:
0:灰度圖像, 1,2,4,8或16
2:真彩色圖像,8或16
3:索引彩色圖像,1,2,4或8
4:帶α通道數(shù)據(jù)的灰度圖像,8或16
6:帶α通道數(shù)據(jù)的真彩色圖像,8或16
Compression method 1 byte 壓縮方法(LZ77派生算法)
Filter method 1 byte 濾波器方法
Interlace method 1 byte 隔行掃描方法:
0:非隔行掃描
1: Adam7(由Adam M. Costello開發(fā)的7遍隔行掃描方法)

由于我們研究的是手機(jī)上的PNG,因此,首先我們看看MIDP1.0對所使用PNG圖片的要求吧:

  • 在MIDP1.0中,我們只可以使用1.0版本的PNG圖片。并且,所以的PNG關(guān)鍵數(shù)據(jù)塊都有特別要求:
    IHDR
  • 文件大小:MIDP支持任意大小的PNG圖片,然而,實際上,如果一個圖片過大,會由于內(nèi)存耗盡而無法讀取。
  • 顏色類型:所有顏色類型都有被支持,雖然這些顏色的顯示依賴于實際設(shè)備的顯示能力。同時,MIDP也能支持alpha通道,但是,所有的alpha通道信息都會被忽略并且當(dāng)作不透明的顏色對待。
  • 色深:所有的色深都能被支持。
  • 壓縮方法:僅支持壓縮方式0(deflate壓縮方式),這和jar文件的壓縮方式完全相同,所以,PNG圖片數(shù)據(jù)的解壓和jar文件的解壓可以使用相同的代碼。(其實這也就是為什么J2ME能很好的支持PNG圖像的原因:))
  • 濾波器方法:盡管在PNG的白皮書中僅定義了方法0,然而所有的5種方法都被支持!
  • 隔行掃描:雖然MIDP支持0、1兩種方式,然而,當(dāng)使用隔行掃描時,MIDP卻不會真正的使用隔行掃描方式來顯示。
  • PLTE chunk:支持
  • IDAT chunk:圖像信息必須使用5種過濾方式中的方式0 (None, Sub, Up, Average, Paeth)
  • IEND chunk:當(dāng)IEND數(shù)據(jù)塊被找到時,這個PNG圖像才認(rèn)為是合法的PNG圖像。
  • 可選數(shù)據(jù)塊:MIDP可以支持下列輔助數(shù)據(jù)塊,然而,這卻不是必須的。

    bKGD cHRM gAMA hIST iCCP iTXt pHYs
    sBIT sPLT sRGB tEXt tIME tRNS zTXt

關(guān)于更多的信息,可以參考http://www.w3.org/TR/REC-png.html

PLTE

調(diào)色板數(shù)據(jù)塊PLTE(palette chunk)包含有與索引彩色圖像(indexed-color image)相關(guān)的彩色變換數(shù)據(jù),它僅與索引彩色圖像有關(guān),而且要放在圖像數(shù)據(jù)塊(image data chunk)之前。

PLTE數(shù)據(jù)塊是定義圖像的調(diào)色板信息,PLTE可以包含1~256個調(diào)色板信息,每一個調(diào)色板信息由3個字節(jié)組成:

顏色

字節(jié)

意義

Red

1 byte

0 = 黑色, 255 = 紅

Green

1 byte

0 = 黑色, 255 = 綠色

Blue

1 byte

0 = 黑色, 255 = 藍(lán)色

因此,調(diào)色板的長度應(yīng)該是3的倍數(shù),否則,這將是一個非法的調(diào)色板。

對于索引圖像,調(diào)色板信息是必須的,調(diào)色板的顏色索引從0開始編號,然后是1、2……,調(diào)色板的顏色數(shù)不能超過色深中規(guī)定的顏色數(shù)(如圖像色深為4的時候,調(diào)色板中的顏色數(shù)不可以超過2^4=16),否則,這將導(dǎo)致PNG圖像不合法。

真彩色圖像和帶α通道數(shù)據(jù)的真彩色圖像也可以有調(diào)色板數(shù)據(jù)塊,目的是便于非真彩色顯示程序用它來量化圖像數(shù)據(jù),從而顯示該圖像。

IDAT

圖像數(shù)據(jù)塊IDAT(image data chunk):它存儲實際的數(shù)據(jù),在數(shù)據(jù)流中可包含多個連續(xù)順序的圖像數(shù)據(jù)塊。

IDAT存放著圖像真正的數(shù)據(jù)信息,因此,如果能夠了解IDAT的結(jié)構(gòu),我們就可以很方便的生成PNG圖像。

IEND

圖像結(jié)束數(shù)據(jù)IEND(image trailer chunk):它用來標(biāo)記PNG文件或者數(shù)據(jù)流已經(jīng)結(jié)束,并且必須要放在文件的尾部。

如果我們仔細(xì)觀察PNG文件,我們會發(fā)現(xiàn),文件的結(jié)尾12個字符看起來總應(yīng)該是這樣的:

00 00 00 00 49 45 4E 44 AE 42 60 82

不難明白,由于數(shù)據(jù)塊結(jié)構(gòu)的定義,IEND數(shù)據(jù)塊的長度總是0(00 00 00 00,除非人為加入信息),數(shù)據(jù)標(biāo)識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。

實例研究PNG

以下是由Fireworks生成的一幅圖像,圖像大小為8*8,為了方便大家觀看,我們將圖像放大:

使用UltraEdit32打開該文件,如下:
00000000~00000007:

可以看到,選中的頭8個字節(jié)即為PNG文件的標(biāo)識。

接下來的地方就是IHDR數(shù)據(jù)塊了:

00000008~00000020:

  • 00 00 00 0D 說明IHDR頭塊長為13
  • 49 48 44 52 IHDR標(biāo)識
  • 00 00 00 08 圖像的寬,8像素
  • 00 00 00 08 圖像的高,8像素
  • 04 色深,2^4=16,即這是一個16色的圖像(也有可能顏色數(shù)不超過16,當(dāng)然,如果顏色數(shù)不超過8,用03表示更合適)
  • 03 顏色類型,索引圖像
  • 00 PNG Spec規(guī)定此處總為0(非0值為將來使用更好的壓縮方法預(yù)留),表示使壓縮方法(LZ77派生算法)
  • 00 同上
  • 00 非隔行掃描
  • 36 21 A3 B8 CRC校驗

00000021~0000002F:

可選數(shù)據(jù)塊sBIT,顏色采樣率,RGB都是256(2^8=256)

00000030~00000062:

這里是調(diào)色板信息

  • 00 00 00 27 說明調(diào)色板數(shù)據(jù)長為39字節(jié),既13個顏色數(shù)
  • 50 4C 54 45 PLTE標(biāo)識
  • FF FF 00 顏色0
  • FF ED 00 顏色1
  • …… ……
  • 09 00 B2 最后一個顏色,12
  • 5F F5 BB DD CRC校驗

00000063~000000C5:

這部分包含了pHYs、tExt兩種類型的數(shù)據(jù)塊共3塊,由于并不太重要,因此也不再詳細(xì)描述了。

000000C0~000000F8:

以上選中部分是IDAT數(shù)據(jù)塊

  • 00 00 00 27 數(shù)據(jù)長為39字節(jié)
  • 49 44 41 54 IDAT標(biāo)識
  • 78 9C…… 壓縮的數(shù)據(jù),LZ77派生壓縮方法
  • DA 12 06 A5 CRC校驗

IDAT中壓縮數(shù)據(jù)部分在后面會有詳細(xì)的介紹。

000000F9~00000104:

IEND數(shù)據(jù)塊,這部分正如上所說,通常都應(yīng)該是

00 00 00 00 49 45 4E 44 AE 42 60 82

至此,我們已經(jīng)能夠從一個PNG文件中識別出各個數(shù)據(jù)塊了。由于PNG中規(guī)定除關(guān)鍵數(shù)據(jù)塊外,其它的輔助數(shù)據(jù)塊都為可選部分,因此,有了這個標(biāo)準(zhǔn)后,我們可以通過刪除所有的輔助數(shù)據(jù)塊來減少PNG文件的大小。(當(dāng)然,需要注意的是,PNG格式可以保存圖像中的層、文字等信息,一旦刪除了這些輔助數(shù)據(jù)塊后,圖像將失去原來的可編輯性。)

刪除了輔助數(shù)據(jù)塊后的PNG文件,現(xiàn)在文件大小為147字節(jié),原文件大小為261字節(jié),文件大小減少后,并不影響圖像的內(nèi)容。

如上說過,IDAT數(shù)據(jù)塊是使用了LZ77壓縮算法生成的,由于受限于手機(jī)處理器的能力,因此,如果我們在生成IDAT數(shù)據(jù)塊時仍然使用LZ77壓縮算法,將會使效率大打折扣,因此,為了效率,只能使用無壓縮的LZ77算法,關(guān)于LZ77算法的具體實現(xiàn),此文不打算深究,如果你對LZ77算法的JAVA實現(xiàn)有興趣,可以參考以下兩個站點:

參考資料:

PNG文件格式白皮書:http://www.w3.org/TR/REC-png.html
為數(shù)不多的中文PNG格式說明:http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm
RFC-1950(ZLIB Compressed Data Format Specification):ftp://ds.internic.net/rfc/rfc1950.txt
RFC-1950(DEFLATE Compressed Data Format Specification):ftp://ds.internic.net/rfc/rfc1951.txt
LZ77算法的JAVA實現(xiàn):http://jazzlib.sourceforge.net/
LZ77算法的JAVA實現(xiàn),包括J2ME版本:http://www.jcraft.com/jzlib/index.html

posted on 2006-11-19 08:11 李錦俊(mybios) 閱讀(4838) 評論(0)  編輯 收藏 引用 所屬分類: 資源壓縮打包
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美黄色大片网站| 亚洲乱码国产乱码精品精天堂| 亚洲午夜一区二区| 一本久道久久综合婷婷鲸鱼| 国产精品ⅴa在线观看h| 欧美淫片网站| 久久字幕精品一区| 一区二区激情视频| 亚洲影院色在线观看免费| 国产亚洲欧美色| 欧美激情一级片一区二区| 欧美日本在线观看| 久久精品日韩| 欧美精品三级| 久久夜色精品亚洲噜噜国产mv| 免费不卡视频| 亚洲欧美日韩在线观看a三区| 久久成人免费电影| 宅男66日本亚洲欧美视频| 西瓜成人精品人成网站| 亚洲乱码国产乱码精品精98午夜 | 午夜精彩视频在线观看不卡| 午夜精品视频| 日韩一区二区精品视频| 欧美一级电影久久| 一本大道久久a久久综合婷婷| 亚洲欧美日韩区| 99re66热这里只有精品3直播| 午夜精品久久久久久久久久久| 亚洲国产精品成人综合色在线婷婷| 一区二区三区日韩| 亚洲国产福利在线| 欧美在线观看网站| 亚洲图片欧美日产| 老司机一区二区三区| 亚洲免费视频成人| 欧美激情综合在线| 免费欧美电影| 国产一区二区三区久久 | 国产日韩精品一区二区三区| 亚洲国产高清一区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲图片在线| 一本久久a久久精品亚洲| 久久免费国产精品| 久久久夜夜夜| 国产一区二区高清| 亚洲综合视频网| 亚洲一区国产精品| 欧美日一区二区三区在线观看国产免| 亚洲精品一区在线观看| 欧美sm极限捆绑bd| 欧美成人性网| 韩国av一区二区三区在线观看| 日韩视频一区二区三区| 99精品欧美一区| 欧美激情区在线播放| 欧美粗暴jizz性欧美20| 在线观看91久久久久久| 久久九九全国免费精品观看| 久久福利视频导航| 国产精品亚洲一区| 亚洲综合色丁香婷婷六月图片| 亚洲欧美欧美一区二区三区| 欧美视频一二三区| 亚洲一区二区三区777| 亚洲欧美在线免费| 国产麻豆精品视频| 欧美中文在线观看| 美日韩精品免费观看视频| 在线日韩视频| 欧美成人免费一级人片100| 亚洲第一福利视频| 亚洲美洲欧洲综合国产一区| 欧美福利视频网站| 日韩午夜电影av| 午夜精品久久久| 狠狠网亚洲精品| 欧美11—12娇小xxxx| 亚洲人成艺术| 午夜精品视频在线观看| 国产日韩欧美综合| 麻豆国产va免费精品高清在线| 亚洲精品美女久久7777777| 亚洲一二三四久久| 国产视频不卡| 欧美高潮视频| 亚洲综合不卡| 蜜桃久久av一区| 亚洲一区自拍| 亚洲成色www8888| 国产精品成人观看视频免费| 午夜精品免费在线| 亚洲三级观看| 欧美在线观看网站| 日韩午夜剧场| 国产主播一区| 欧美日韩免费观看一区=区三区| 亚洲午夜精品一区二区| 女人天堂亚洲aⅴ在线观看| 一区二区三区四区五区在线| 国产一区深夜福利| 欧美区在线观看| 久久免费高清| 亚洲欧美日韩在线综合| 亚洲欧洲精品一区二区| 久久国产一区| 中日韩美女免费视频网址在线观看 | 欧美一区亚洲一区| 亚洲精品一区中文| 国产一区二区av| 国产精品久久久一本精品| 蜜桃久久精品一区二区| 欧美一区二区视频网站| 亚洲美女免费精品视频在线观看| 久久躁狠狠躁夜夜爽| 欧美一区二视频| 亚洲午夜一区二区| 日韩一区二区免费高清| 欧美在线视频一区二区三区| 欧美片在线播放| 久久精品中文字幕免费mv| 亚洲男人的天堂在线观看| 亚洲精品久久嫩草网站秘色| 老司机免费视频久久| 欧美亚洲日本网站| 亚洲一本大道在线| 一区二区冒白浆视频| 91久久精品国产91久久| 在线观看成人一级片| 国内精品久久久久影院色| 国产欧美1区2区3区| 国产精品日韩高清| 国产精品v欧美精品∨日韩| 欧美日韩精品一区二区天天拍小说| 久久久青草青青国产亚洲免观| 欧美一级夜夜爽| 欧美一区网站| 欧美在线观看视频一区二区| 久久se精品一区二区| 久久aⅴ乱码一区二区三区| 午夜精品福利电影| 欧美一区亚洲| 久久免费国产精品| 麻豆精品国产91久久久久久| 免费日韩av片| 欧美电影资源| 欧美日一区二区在线观看 | 亚洲欧美国产视频| 亚洲午夜激情网站| 欧美亚洲综合久久| 久久精品一本| 免费观看国产成人| 欧美日韩成人综合在线一区二区| 欧美另类变人与禽xxxxx| 欧美日韩调教| 国产视频在线观看一区二区三区| 国产无遮挡一区二区三区毛片日本| 国产日韩综合| 亚洲国产91精品在线观看| 亚洲精品少妇网址| 午夜电影亚洲| 美女脱光内衣内裤视频久久网站| 欧美ed2k| 99www免费人成精品| 香蕉亚洲视频| 欧美精品久久久久久久免费观看 | 欧美精品久久久久久久久久| 国产精品亚洲综合久久| 一区二区在线观看av| 99国产麻豆精品| 久久精品91| 亚洲另类视频| 欧美中文字幕在线播放| 欧美激情精品久久久| 国产欧美一区二区白浆黑人| 亚洲人成网站在线观看播放| 在线视频一区二区| 美女主播视频一区| 在线一区二区视频| 蜜月aⅴ免费一区二区三区| 国产精品美女在线观看| 亚洲国产精品一区制服丝袜| 亚洲欧美激情一区| 亚洲国产三级在线| 亚洲欧美制服另类日韩| 欧美精品一区在线观看| 黄色欧美成人| 亚洲中午字幕| 亚洲人屁股眼子交8| 久久久久久久久久看片| 国产精品久久久亚洲一区| 亚洲激情第一页| 久久久999精品免费| 99国产一区| 欧美成人综合一区| 永久域名在线精品| 久久另类ts人妖一区二区| 亚洲婷婷免费| 欧美日韩午夜|