PNG文件头格式解析

近来为了获取图片大小,有点伤脑筋,引擎库不能再读取文件路径后马上得到图片大小

所以无奈决定,直接通过读取png文件头来获取文件大小,这部分,确实蛋疼,找了些资料,都不是很满意


下面这部分内容转自:http://www.blogjava.net/security/archive/2006/06/08/51292.html

00000000h: 89 50 4E 47 0D 0A 1A 0A00 00 00 0D49 48 44 52 ; 塒NG........IHDR
00000010h: 00 00 00 CE 00 00 00 CE 08 02 00 00 00 F9 7D AA ; ...?..?....鶀?
00000020h: 93 00 00 00 09 70 48 59 73 00 00 0A 75 00 00 0A ; ?...pHYs...u...
00000030h: 75 01 4A 25 DD FD 00 00 0C 91 49 44 41 54 78 9C ; u.J%蔟...慖DATx?
00000040h: ED 9D D9 96 DC 2A 0C 45 A9 AC FC FF 2F D7 7D 70 ; 頋贃?.E┈?/讅p
00000050h: C7 97 66 10 9A 98 CF 7E C8 EA 54 95 6D 86 83 24 ; 菞f.殬蟸汝T昺唭$
00000060h: 04 B6 3F DF EF 37 00 D0 9F 3F B3 0B 00 6E 01 52 ; .?唢7.袩??.n.R
00000070h: 03 83 F8 3B BB 00 AB F2 F9 98 0E 47 58 92 01 A9 ; .凐;?鶚.GX??
 

89 50 4E 47 0D 0A 1A 0A 是PNG头部署名域,表示这是一个PNG图片
00 00 00 0D 描述IHDR头部的大小
49 48 44 52 是Chunk Type Code, 这里Chunk Type Code=IHDR
00 00 00 CE 00 00 00 CE 08 02 00 00 00 描述了Chunk Data,它是可变长度数据00 00 00 0D 定义了长度为13个Bytes,所以,这里,你看到是13个字节)
F9 7D AA 93 是对IHDR的CRC校验

紧接着下面的就是pHys数据块,原理也是一样

------------------------------------------------------------------------------------------------------

但是这里还是木有文件头的信息,接下来,可以参考如下:


也就是可以从IHDR中,来获取头文件信息,这里的IHDR,其实在开始就可以看到了

00 00 00 CE 00 00 00 CE 08 02 00 00 00 描述了Chunk Data

也就是前面的这块数据,前四个字节是宽度,后四个字节是高度,也就是此图大小为:206 * 206

由于,暂时不需要其他数据,也就不再往下研究,直接贴上,lua获取png文件头的代码

function hexstring2number(hexstring, len)
	if not len or len > 8 then return end

	local hexbyte = {}
	for i = 1, len do
		hexbyte[i] = string.byte(hexstring, i)
	end

	local num = tonumber(string.format("0x%x%x%x%x", hexbyte[1], hexbyte[2], hexbyte[3], hexbyte[4]), 16)
	return num
end

function get_png_size(path)
	local png_file = io.open(path, "rb")
	local data = png_file:read("*all")

	-- 保证png至少有37个字节,因为包含文件头等起码就超过这个数字了
	if #data < 37 then return end

	-- 文件头的相关信息请百度
	local png_header_info = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52}
	for i = 1, #png_header_info do
		if (string.byte(data, i) ~= png_header_info[i]) then
			return
		end
	end

	-- 这四个字节表示png的宽度
	data = string.sub(data, #png_header_info + 1)
	local width = hexstring2number(data, 4)

	-- 这四个字节表示png的高度
	data = string.sub(data, 5)
	local height = hexstring2number(data, 4)

	return width, height
end

get_png_size("2.png")


  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PNG (Portable Network Graphics) 文件文件是由 8 个字节组成的二进制数据。这 8 个字节分别是: 137 80 78 71 13 10 26 10 这些字节的十六进制表示分别是: 89 50 4E 47 0D 0A 1A 0A 这些字节的意义是: 89 50 4E 47:PNG 的 ASCII 码 0D 0A:换行符 1A 0A:文件结束符 这 8 个字节的顺序不能改变,否则文件就不是 PNG 格式文件了。 ### 回答2: PNG文件文件是一个8个字节长度的标识符,用于识别文件格式。该标识符的十六进制值为89 50 4E 47 0D 0A 1A 0A,对应的ASCII码为‰PNG....。其中‰代表文件是一个PNG图像文件PNG则是Portable Network Graphics的缩写,意为便携式网络图形。其他字节则是固定的数值,用于标识这是一个PNG文件。 具体来说,文件的8个字节分别表示以下内容: 1. 89是个固定值,表示该文件是一个PNG文件。 2. 50 4E 47对应的ASCII码为PNG,表示该文件是一个PNG图像文件。 3. 0D 0A则是一个换行符,表示一个新行的开始。 4. 1A是一个Ctrl+Z控制字符,表示文件的结束位置。 5. 最后的0A是一个换行字符,表示该行的结束。 通过读取文件的这8个字节,我们可以确定一个文件是否是有效的PNG文件,并且可以开始解析文件的其他部分,如图像数据和元数据等。因此,文件是识别PNG文件格式的重要部分。 ### 回答3: PNG文件是指PNG图像文件文件部分。PNG是一种无损的位图图像格式,其文件用于识别这个文件是一个PNG图像文件PNG文件包含8个字节,它们的十六进制数值分别是89 50 4E 47 0D 0A 1A 0A。这些字节会出现在PNG图像文件的起始位置,用于告知操作系统或软件该文件格式PNG图像文件。 具体地,这8个字节的含义如下: - 89:固定值,表示该文件是一个有效的PNG图像文件。 - 50 4E 47:字母"P"、"N"、"G",用于标识该文件是一个PNG图像文件。 - 0D 0A:回车换行符,表示文件的结束。 - 1A:文件结尾标记。 - 0A:换行符,表示文件的结束。 通过读取文件的这些字节,操作系统或软件可以识别该文件是否为PNG图像文件,并据此进行相应的处理,如显示图像、压缩解码等。 需要注意的是,PNG文件并不是唯一确定该文件是否为有效的PNG图像文件的方式,它只是一个标识,因此在实际处理中还需要进行更多的验证和解析操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值