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

所以无奈决定,直接通过读取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文件头的代码

[cpp] view plaincopy
  1. function hexstring2number(hexstring, len)
  2. if not len or len > 8 then return end
  3. local hexbyte = {}
  4. for i = 1, len do
  5. hexbyte[i] = string.byte(hexstring, i)
  6. end
  7. local num = tonumber(string.format("0x%x%x%x%x", hexbyte[1], hexbyte[2], hexbyte[3], hexbyte[4]), 16)
  8. return num
  9. end
  10. function get_png_size(path)
  11. local png_file = io.open(path, "rb")
  12. local data = png_file:read("*all")
  13. -- 保证png至少有37个字节,因为包含文件头等起码就超过这个数字了
  14. if #data < 37 then return end
  15. -- 文件头的相关信息请百度
  16. local png_header_info = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52}
  17. for i = 1, #png_header_info do
  18. if (string.byte(data, i) ~= png_header_info[i]) then
  19. return
  20. end
  21. end
  22. -- 这四个字节表示png的宽度
  23. data = string.sub(data, #png_header_info + 1)
  24. local width = hexstring2number(data, 4)
  25. -- 这四个字节表示png的高度
  26. data = string.sub(data, 5)
  27. local height = hexstring2number(data, 4)
  28. return width, height
  29. end
  30. get_png_size("2.png")

PNG文件头格式解析相关推荐

  1. 常见的文件头格式解析

    1.从Ultra-edit-32中提取出来的 附件:文件格式分析器 JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:4749463 ...

  2. java音频解析_wav音频文件头动态解析--java语言

    之前有处理过一些相对较为不常见的音频格式,也睬过很多坑,这里做一下简单记录.后面可能随着接触音频类型的增多做进一步更新,像之前有记录过包含LIST数据块的wav格式录音就是调试过程中发现遗漏点. 在此 ...

  3. wav文件头格式详解

    wav文件头格式详解 首先先声明几个变量: int file_size;      //文件大小 int channel;        //声道数 int sample_rate;   //采样率 ...

  4. 一、各种WAV文件头格式

    Wav文件也分好几个种类,相应的非数据信息存储在文件头部分,以下是各种WAV文件头格式. 表1 8KHz采样.16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节) 偏移地址 字节数 数 ...

  5. g711音频封装wav文件头格式

    g711音频封装wav文件头格式 之前的客户需求,平台音频不支持g711格式,只支持wav/mp3,wav格式封装比较简单,只需要在原始音频数据上封装一层wav头就可以,在此记录一下该模块接口.参考开 ...

  6. 恶意Office文档解析——1. Office文档格式解析

    写在前面:这是我最近在做的一个小课题,按照研究进度不定期更新.主要是学习前人的研究思路,自己开发的内容会比较少. 复合文档的概念 复合文档不仅包含文本,而且包括图形.电子数据表格.声音.视频等其他信息 ...

  7. 位图(BMP)文件头格式及数据分析

    由于BMP文件有诸多格式,这里只以256色彩色位图为例来分析一下. 这个图是我自己用画图板做的,如下. 图1 BMP图 由于这里限制上传BMP文件,所以这个是JPG的.我的原始的BMP文件大小是200 ...

  8. java校验文件头格式_转自:java 文件格式二进制头文件校验

    转自:https://blog.csdn.net/useprogram/article/details/90637401 public class FileTypeUtil { private fin ...

  9. Audio WAV文件头格式

    最近需要对多个WAV文件进行拼接,这就涉及到WAV文件头的创建和修改更新.之前的方式是利用第一个WAV的文件头,在最后全部拼接完后再修改文件头中的文件长度及音频数据长度.这个长度如果不修改,最后拼接的 ...

最新文章

  1. 排序算法中平均时间复杂度_操作系统中的作业排序(算法,时间复杂度和示例)...
  2. ECS开放批量创建实例接口RunInstances
  3. 深圳市南山区学计算机的视频课程,新手学电脑全套视频教程(1-27集)
  4. 同步函数与同步代码块的区别
  5. 一文初探Tensorflow高级API使用(初学者篇)
  6. mybatisPlus代码自动生成
  7. afc2add是什么有什么用怎么安装_afc2add详解
  8. win7文件共享服务器搭建,Win7下搭建web服务器实现数据共享的简单步骤
  9. 定期存款的转存临界点计算公式
  10. shang*biao
  11. 图片与mat文件的转换
  12. XPosed及插件安装(解决下载http://dl.xposed.info/repo/full.xml.gz时出错的问题)
  13. 2023轻薄投影仪首选:极米Z6X Pro入手超值!
  14. creator 面试
  15. 二值神经网络(Binary Neural Network,BNN)
  16. 基于C/C++的hex、s19文件相互转换
  17. potplayer最佳设置_PotPlayer调整常用设置让播放器效果更佳的具体操作流程
  18. 初入职场“荒野求生”,五条靠谱的生存指南
  19. 天载免息股票热点轮动太快
  20. GTOP@全球CEO发展大会 燃焕全球科创力场

热门文章

  1. jxls jx:each(item 对象中的列表
  2. [附源码]Python计算机毕业设计Django中小学课后延时服务管理系统
  3. 2021.04.08 线程和进程的使用
  4. 大数据领域的12大工具,市面上主要的大数据分析工具都在这了!
  5. Fastlane带来的全自动化部署
  6. android系统架构及源码目录结构
  7. 〖全域运营实战白宝书 - 高转化文案速成篇①〗- 文案速成导学与常见文案类型
  8. 移动云mas发送短信一直返回InvalidUsrOrPwd
  9. 如何在Github上大学
  10. JAVA:实现Graphs图表算法(附完整源码)