Re: [問題] ObjectOutputStream + ImageIO 出現的問題

看板java作者 ((short)(-15074))時間14年前 (2010/01/01 21:59), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串4/7 (看更多)
稍微查了一下 png 的 spec 我分析一下這段 binary 說一下原因 ※ 引述《tkcn (小安)》之銘言: : 這張圖片的 16 進位 data 如下: (69-byte) : 89 50 4E 47 0D 0A 1A 0A 這是 png 的簽名 : 00 00 00 0D 49 48 44 52 : 00 00 00 01 00 00 00 01 08 02 00 00 00 90 77 53 : DE 這裡是第一塊 IHDR 區 00 00 00 0D 是長度 = 13 49 48 44 52 就是 "IHDR" 中間 13 byte 略 最後的 90 77 53 DE 是本區的 checksum : 00 00 00 0C 49 44 41 54 78 DA 63 F8 FF FF 3F : 00 05 FE 02 FE 33 12 95 14 這是第二塊 IDAT 區 同樣 00 00 00 0C 長度 = 12 49 44 41 54 "IDAT" 中間 12 byte 略 33 12 95 14 本區 checksum : 00 00 00 00 49 45 4E : 44 AE 42 60 82 最後這 12 byte 邏輯上也是一區 (叫 IEND 區) 同樣可以分解 00 00 00 00 長度 = 0 49 45 4E 44 "IEND" AE 42 60 82 本區 checksum, 但因為都是這些資料所以也是固定的 因此實際上可以視為 png 的固定結尾 即所有 png 皆由這 12 byte 結束 : ImageIO.write() 會寫出 69 byte, : 而 ImageIO.read() 只會讀入 53 byte, : 我試著把原始的 png 檔案只留下前 53 byte,(或著是隨意竄改最後 16-byte) : 這個時候秀圖軟體是沒辦法開啟這個檔案的, : 但是用 ImageIO.read() 還是可以正常的讀入圖片。 : 我猜測最後的 16-byte 應該是 png 格式的 check sum 之類的東西吧, : 而 ImageIO.read() 並沒有做這樣的驗證,甚至資料連讀都沒讀 Orz : 有錯請指教,謝謝。 這樣一來這 16 byte 的正體就明白了: 它正是 IDAT 區的結尾 checksum 以及固定的 IEND 區 IEND 區不讀可以理解啦 但 spec 有說 IDAT 區可以有一個以上 這樣略過它的 checksum 不會出事嗎...? -- 'You've sort of made up for it tonight,' said Harry. 'Getting the sword. Finishing the Horcrux. Saving my life.' 'That makes me sound a lot cooler then I was,' Ron mumbled. 'Stuff like that always sounds cooler then it really was,' said Harry. 'I've been trying to tell you that for years.' -- Harry Potter and the Deathly Hollows, P.308 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92

01/01 22:23, , 1F
也許 IHDR 裡頭會紀錄有幾個 IDAT?
01/01 22:23, 1F

01/01 22:39, , 2F
試過RW後多個IDAT會被處理成一個,且忽略ancillary chunk
01/01 22:39, 2F
文章代碼(AID): #1BFV_IHA (java)
討論串 (同標題文章)
文章代碼(AID): #1BFV_IHA (java)