現需要生成一無壓縮的png檔案。
在網上找到一文:《PNG檔案結構分析之二(在手機上生成PNG檔案)》(可在google搜到)
我已按這個格式正確生成了png檔案
查閱其他資料可知,PNG檔案可以有多個IDAT chunk, 但如何組織多個IDAT構成PNG檔案則沒有詳細說明。
作了如下實驗,生成的檔案用看圖軟體打開時提示有錯。
一個50行50列像素的圖,分為連續的兩個IDAT存資料,第一個存25行50列(即影像的上半截),另一個IDAT存25行50列(即影像的下半截)。每個IDAT CHUNK的無壓縮的LZ77壓縮塊都以0x78, 0xda, 0x1開頭,然后是LEN、NLEN,然后是資料,然后是crc資訊。
奇怪的是,2個idat,分別是影像的上半部分和下半部分,如果是一個idat,不管是上半部還是下半部能正常顯示,但是合到一起就只顯示第一個idat的內容,非常奇怪


看圖可知,上面分別是一個png的上半部和下半部,單獨顯示都ok,合到一起就不行了,第一個idat可以顯示,緊接著的第二個就一片空白,不知道多個idat資料要怎么才能正確顯示
uj5u.com熱心網友回復:
幫頂。。。勿沉uj5u.com熱心網友回復:
沒人研究過么?w3c檔案上也沒有找到關于這一塊的詳細解釋uj5u.com熱心網友回復:
貌似挺復雜的,建議先去阿發伯的博客上翻翻看http://blog.csdn.net/maozefa/
uj5u.com熱心網友回復:
無解,查不到任何資料
uj5u.com熱心網友回復:
為什么不用TPNGObject? 也可以比對你的具體實作和它的差別,看問題出在哪。uj5u.com熱心網友回復:
不知樓主的問題解決沒有,我也遇到同樣的問題我一開始的做法是先將資料分塊,得到資料塊
A0,A1,A2...
然后按deflate的格式打包,即在每個A資料塊前面增加0x01, LEN, ~LEN共5bytes,得到打包后的資料塊
B0,B1,B2...
再按zlib的格式進行打包,即在每個B資料塊前面增加CMF和FLG,即你提到的0x78, 0xda,得到再次打包后的資料塊
C0,C1,C2...
然后按IDAT chunk的格式進行封裝,得到的就是與樓主一樣的效果
后來仔細研讀了一下PNG協議,終于看出問題所在,關鍵在于PNG協議中有這么一句話:
“The compressed datastream is then the concatenation of the contents of all the IDAT chunks”
即是說最后解圖的時候是把所有的IDAT中的資料連在一起組成資料流,那么我之前的打包方法把所有的IDAT拼接后就是很多zlib的資料塊,感覺不太對勁,所以把方法糾正如下:
第一步一樣,按deflate的格式打包,即在每個A資料塊前面增加0x01, LEN, ~LEN共5bytes,得到打包后的資料塊
B0,B1,B2...
第二步就不同了,這里應該把所有的{B1,B2,B3...}看成一個整體,一個完整的資料流,對這個完整的資料流進行zlib格式打包,得到一個大的資料塊 C
然后再按IDAT要求的最大資料長度對C進行分塊,放到每一個IDAT中,這樣就可以出來正確的影像了
希望對你有幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93136.html
