我需要找到jpeg(jfif)图像的大小.图像不会保存为独立文件,因此我无法使用GetFileSize或任何其他此类API(图像放置在流中,除了通常的jpeg/jfif标头之外不存在其他标头(s) ).
我做了一些研究,发现JPEG图像由不同的部分组成,每个部分以帧标记(0xFF; XX)开始,以及该帧的大小.使用此信息,我能够从文件中解析大量信息.
问题是我无法找到压缩数据的大小,因为似乎压缩数据没有帧标记.此外,似乎压缩数据遵循SOS(FF; DA)标记,并且图像以图像结束(EOI)(FF; D9)标记结束.
实现这一目标的一种方法是从一个字节到另一个字节搜索EOI标记,但我认为压缩数据可能包含这个字节组合,对吧?
您是否知道一种简单而正确的方法来查找图像的总大小?(我非常喜欢一些没有任何外部库的代码/想法:))?
基本上,我需要图像开始(SOI-FFE0)和图像结束(EOI-FFD9)之间的距离(以字节为单位).
Ada*_*ode 38
压缩数据不包括SOI或EOI字节,因此您在那里安全.但评论,应用程序数据或其他标题可能会.幸运的是,您可以在给出长度时识别并跳过这些部分.
JPEG规范告诉您需要什么:http:
//www.w3.org/Graphics/JPEG/itu-t81.pdf
请参见表B.1,第32页.具有*的符号后面没有长度字段(RST,SOI,EOI,TEM).其他人呢.
你需要跳过各个领域,但这并不算太糟糕.
怎么办:
开始阅读SOI(FFD8).这是一个开始.它应该是流中的第一件事.
然后,浏览文件,查找更多标记并跳过标题:
SOI标记(FFD8):图像损坏.你应该已经找到了一个EOI!
TEM(FF01):独立标记,继续.
RST(FFD0通过FFD7):独立标记,继续.您可以验证重启标记是否从重复计数FFD0到FFD7重复,但这不是测量长度所必需的.
EOI标记(FFD9):你已经完成了!
任何不是RST,SOI,EOI,TEM 的标记(FF01通过FFFE,减去上述例外):在标记之后,读取接下来的2个字节,这是该帧头的16位大端长度(不包括2 -byte标记,但包括长度字段).跳过给定的数量(通常长度减去2,因为你已经得到了这些字节).
如果您在EOI之前收到文件结尾,那么您的图像已损坏.
一旦你有了EOI,你就已经完成了JPEG并且应该有长度.如果您希望流中有多个JPEG,则可以通过读取另一个SOI重新开始.
| 归档时间: |
|
| 查看次数: |
19045 次 |
| 最近记录: |