作者LPH66 ((short)(-15074))
看板java
标题Re: [问题] ObjectOutputStream + ImageIO 出现的问题
时间Fri Jan 1 21:59:43 2010
稍微查了一下 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
1F:推 tkcn:也许 IHDR 里头会纪录有几个 IDAT? 01/01 22:23
2F:推 snowlike:试过RW後多个IDAT会被处理成一个,且忽略ancillary chunk 01/01 22:39