Re: [問題] ObjectOutputStream + ImageIO 出現的問題
稍微查了一下 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
01/01 22:23, 1F
推
01/01 22:39, , 2F
01/01 22:39, 2F
討論串 (同標題文章)
完整討論串 (本文為第 4 之 7 篇):