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

李錦俊(mybios)的blog

游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

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

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 372634
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

前言

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

PNG數據塊(Chunk)

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

下表就是PNG中數據塊的類別,其中,關鍵數據塊部分我們使用深色背景加以區分。

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

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

數據塊結構

PNG文件中,每個數據塊由4個部分組成,如下:

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

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

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

下面,我們依次來了解一下各個關鍵數據塊的結構吧。

IHDR

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

文件頭數據塊由13字節組成,它的格式如下表所示。

域的名稱
字節數
說明
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:帶α通道數據的灰度圖像,8或16
6:帶α通道數據的真彩色圖像,8或16
Compression method 1 byte 壓縮方法(LZ77派生算法)
Filter method 1 byte 濾波器方法
Interlace method 1 byte 隔行掃描方法:
0:非隔行掃描
1: Adam7(由Adam M. Costello開發的7遍隔行掃描方法)

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

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

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

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

PLTE

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

PLTE數據塊是定義圖像的調色板信息,PLTE可以包含1~256個調色板信息,每一個調色板信息由3個字節組成:

顏色

字節

意義

Red

1 byte

0 = 黑色, 255 = 紅

Green

1 byte

0 = 黑色, 255 = 綠色

Blue

1 byte

0 = 黑色, 255 = 藍色

因此,調色板的長度應該是3的倍數,否則,這將是一個非法的調色板。

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

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

IDAT

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

IDAT存放著圖像真正的數據信息,因此,如果能夠了解IDAT的結構,我們就可以很方便的生成PNG圖像。

IEND

圖像結束數據IEND(image trailer chunk):它用來標記PNG文件或者數據流已經結束,并且必須要放在文件的尾部。

如果我們仔細觀察PNG文件,我們會發現,文件的結尾12個字符看起來總應該是這樣的:

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

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

實例研究PNG

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

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

可以看到,選中的頭8個字節即為PNG文件的標識。

接下來的地方就是IHDR數據塊了:

00000008~00000020:

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

00000021~0000002F:

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

00000030~00000062:

這里是調色板信息

  • 00 00 00 27 說明調色板數據長為39字節,既13個顏色數
  • 50 4C 54 45 PLTE標識
  • FF FF 00 顏色0
  • FF ED 00 顏色1
  • …… ……
  • 09 00 B2 最后一個顏色,12
  • 5F F5 BB DD CRC校驗

00000063~000000C5:

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

000000C0~000000F8:

以上選中部分是IDAT數據塊

  • 00 00 00 27 數據長為39字節
  • 49 44 41 54 IDAT標識
  • 78 9C…… 壓縮的數據,LZ77派生壓縮方法
  • DA 12 06 A5 CRC校驗

IDAT中壓縮數據部分在后面會有詳細的介紹。

000000F9~00000104:

IEND數據塊,這部分正如上所說,通常都應該是

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

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

刪除了輔助數據塊后的PNG文件,現在文件大小為147字節,原文件大小為261字節,文件大小減少后,并不影響圖像的內容。

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

參考資料:

PNG文件格式白皮書:http://www.w3.org/TR/REC-png.html
為數不多的中文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實現:http://jazzlib.sourceforge.net/
LZ77算法的JAVA實現,包括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>
            欧美.www| 亚洲天堂激情| 999亚洲国产精| 亚洲第一色在线| 亚洲精品欧美专区| 一本色道88久久加勒比精品| 一本色道久久综合亚洲精品婷婷 | 黄色在线一区| 精品二区视频| 日韩视频在线免费| 亚洲一区二区三区在线观看视频| 亚洲欧美日本国产专区一区| 久久精品国产清自在天天线| 欧美成人精精品一区二区频| 亚洲精品国产视频| 制服丝袜亚洲播放| 欧美在线观看天堂一区二区三区| 久久免费偷拍视频| 欧美日韩视频不卡| 国模精品一区二区三区| 亚洲人午夜精品免费| 亚洲午夜伦理| 免费影视亚洲| 亚洲在线第一页| 欧美成人三级在线| 国产欧美日韩亚洲| 亚洲最黄网站| 久久综合色播五月| 亚洲网站在线观看| 欧美大片91| 国内自拍视频一区二区三区| 在线亚洲成人| 欧美激情麻豆| 欧美一区二区三区免费视频 | 国产一区二区三区成人欧美日韩在线观看 | 一区二区高清在线| 久久精品亚洲乱码伦伦中文| 亚洲国产成人91精品| 性色av一区二区三区| 欧美日韩另类综合| 亚洲国产婷婷| 久久字幕精品一区| 午夜精品久久久久影视| 欧美色中文字幕| 亚洲精品视频在线观看网站| 每日更新成人在线视频| 午夜精品亚洲| 国产精品日韩在线观看| 亚洲视频免费| 亚洲美女黄色| 欧美人交a欧美精品| 91久久久久久久久久久久久| 毛片基地黄久久久久久天堂| 久久精品国产v日韩v亚洲| 国产精品免费网站| 亚洲一区二区欧美| 日韩视频国产视频| 欧美日韩精品不卡| 亚洲五月六月| 中文欧美在线视频| 国产精品毛片在线看| 午夜精品久久久久久99热软件| 一区二区三区日韩欧美| 欧美日韩在线播| 亚洲综合三区| 先锋影音一区二区三区| 国产一区二区高清| 美女精品视频一区| 美女精品视频一区| 亚洲精品综合| 99视频有精品| 国产精品综合不卡av| 久久超碰97人人做人人爱| 欧美一区二区三区视频| 尤物网精品视频| 欧美激情一区| 欧美午夜精品久久久| 午夜精品亚洲| 久久久国产视频91| 亚洲看片一区| 亚洲永久在线| 亚洲高清资源| 99视频精品在线| 国产亚洲一区二区三区在线观看| 久久亚洲综合| 欧美日本乱大交xxxxx| 小嫩嫩精品导航| 久久久91精品国产一区二区精品| 91久久国产综合久久91精品网站| 亚洲伦伦在线| 狠狠色综合播放一区二区| 亚洲国产色一区| 国产欧美日韩激情| 亚洲国产清纯| 亚洲欧美福利一区二区| 久久综合一区| 欧美日韩三级| 老司机午夜精品视频在线观看| 欧美搞黄网站| 久久se精品一区精品二区| 美女亚洲精品| 性色av一区二区三区在线观看 | 亚洲区国产区| 国产午夜精品美女毛片视频| 亚洲国产精品黑人久久久| 国产精品久久久久久久7电影 | 麻豆国产精品777777在线| 欧美日韩视频在线| 农夫在线精品视频免费观看| 国产精品久久久久久影视| 欧美激情bt| 国产主播一区二区三区| 亚洲视频一区在线观看| 亚洲精品视频一区| 久久久国产一区二区| 亚洲欧美视频一区| 欧美久久视频| 欧美福利一区二区| 合欧美一区二区三区| 亚洲永久精品大片| 亚洲一级黄色片| 欧美成人综合一区| 美女视频黄 久久| 国产主播一区二区三区| 亚洲影院在线观看| 午夜伦理片一区| 欧美亚洲成人网| 亚洲精品在线观看免费| 亚洲精品免费一二三区| 蜜桃伊人久久| 欧美激情第8页| 亚洲精美视频| 免费毛片一区二区三区久久久| 久久只精品国产| 樱花yy私人影院亚洲| 久久久久久久综合| 欧美不卡高清| 亚洲激情亚洲| 欧美激情按摩在线| 最新国产乱人伦偷精品免费网站| 91久久亚洲| 欧美大片免费观看| 亚洲人体一区| 亚洲无人区一区| 国产农村妇女毛片精品久久莱园子 | 性欧美暴力猛交69hd| 国产女优一区| 久久久久久久欧美精品| 欧美大片免费久久精品三p | 国产欧美日韩伦理| 亚洲综合电影| 久久蜜桃精品| 欧美激情麻豆| 亚洲作爱视频| 国产精品a久久久久| 亚洲一区二三| 久久影视精品| 亚洲理伦电影| 国产精品入口尤物| 久久久国产精品一区二区三区| 欧美成人激情在线| 在线视频精品| 国产日韩一区二区三区在线| 久久国产精品免费一区| 亚洲高清在线播放| 亚洲综合欧美日韩| 狠狠干成人综合网| 欧美国产欧美亚州国产日韩mv天天看完整 | 久久久久久久一区二区三区| 亚洲国产国产亚洲一二三| 中文精品视频一区二区在线观看| 国产精品久久久爽爽爽麻豆色哟哟 | 韩国欧美国产1区| 老司机午夜精品视频| 99pao成人国产永久免费视频| 欧美一区2区三区4区公司二百| 极品少妇一区二区三区| 欧美日韩亚洲激情| 久久米奇亚洲| 亚洲一区二区三区四区在线观看| 老牛嫩草一区二区三区日本 | 黄色成人在线网站| 欧美日韩精品免费在线观看视频| 午夜老司机精品| 91久久线看在观草草青青| 久久久91精品国产| 亚洲图片欧美一区| 亚洲国产经典视频| 国产一级一区二区| 国产精品麻豆va在线播放| 欧美黄在线观看| 久久精品视频在线看| 亚洲一区免费| 亚洲免费av网站| 亚洲电影免费在线| 免费欧美视频| 久久久久久久一区二区| 亚洲欧美日韩精品久久| 一区二区高清视频在线观看| 91久久精品www人人做人人爽 |