jpeg(jfif)图像的大小

bot*_*ius 30 size jpeg

我需要找到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).其他人呢.

你需要跳过各个领域,但这并不算太糟糕.

怎么办:

  1. 开始阅读SOI(FFD8).这是一个开始.它应该是流中的第一件事.

    • 然后,浏览文件,查找更多标记并跳过标题:

    • SOI标记(FFD8):图像损坏.你应该已经找到了一个EOI!

    • TEM(FF01):独立标记,继续.

    • RST(FFD0通过FFD7):独立标记,继续.您可以验证重启标记是否从重复计数FFD0FFD7重复,但这不是测量长度所必需的.

    • EOI标记(FFD9):你已经完成了!

    • 任何不是RST,SOI,EOI,TEM 的标记(FF01通过FFFE,减去上述例外):在标记之后,读取接下来的2个字节,这是该帧头的16位大端长度(不包括2 -byte标记,但包括长度字段).跳过给定的数量(通常长度减去2,因为你已经得到了这些字节).

    • 如果您在EOI之前收到文件结尾,那么您的图像已损坏.

    • 一旦你有了EOI,你就已经完成了JPEG并且应该有长度.如果您希望流中有多个JPEG,则可以通过读取另一个SOI重新开始.

  • 这里缺少的是当你找到一个SOS(扫描开始)标记时,你不仅要跳过标记段本身,还要跳过紧随其后的熵编码段.标记不能出现在熵编码的段内,因此只需保持扫描直到您读取FF后跟任何不等于0的字节.(参见B.1.1.5"熵编码数据段",注2). (8认同)
  • 这对我帮助很大,但是我找到了另一个参考文献,当你找到SOS标记时,你需要开始阅读寻找EOI标记的数据,这将是结束.http://gvsoft.homedns.org/exif/Exif-explanation.html这与我在ATM上工作的图像相符. (5认同)