gpt4 book ai didi

size - 确定JPEG(JFIF)图像的大小

转载 作者:行者123 更新时间:2023-12-03 09:08:13 28 4
gpt4 key购买 nike

我需要找到JPEG(JFIF)图像的大小。该图像不会保存为独立文件,因此我不能使用GetFileSize或任何其他API这样的图像(该图像放置在流中,并且不存在其他 header ,但通常的JPEG / JFIF header 除外) ))。

我进行了一些研究,发现JPEG图像由不同的部分组成,每个部分都以帧标记(0xFF 0xXX)开头以及该帧的大小。使用此信息,我能够从文件中解析很多信息。

问题是,我找不到压缩数据的大小,因为似乎没有用于压缩数据的帧标记。此外,似乎压缩数据遵循SOS(FFDA)标记,并且图像以图像结束(EOI)(FFD9)标记结束。

一种实现此目的的方法是逐字节搜索EOI标记,但是我认为压缩数据可能包含此字节组合,对吗?

有没有一种简单正确的方法来查找图像的总大小? (我更喜欢一些没有任何外部库的代码/想法)

基本上,我需要图像开始(SOI- FFE0)和图像结束(EOI-FFD9)之间的距离(以字节为单位)。

最佳答案

压缩的数据将不包含SOI或EOI字节,因此您在那很安全。但是注释,应用程序数据或其他标题可能会出现。幸运的是,您可以根据长度确定并跳过这些部分。

JPEG规范告诉您您需要什么:
http://www.w3.org/Graphics/JPEG/itu-t81.pdf

请参阅第32页的表B.1。带有*的符号后面没有长度字段(RST,SOI,EOI,TEM)。其他人做。

您将需要跳过各个字段,但这还不错。

如何经历:

  • 开始阅读SOI(FFD8)。这是开始。它应该是流中的第一件事。
  • 然后,浏览文件,查找更多标记并跳过标题:
  • SOI标记(FFD8):损坏的图像。您应该已经找到了EOI!
  • TEM(FF01):独立标记,请继续。
  • RST(FFD0FFD7):独立标记,继续。您可以验证重新启动标记从FFD0FFD7计数并重复,但是这对于测量长度不是必需的。
  • EOI标记(FFD9):完成!
  • 任何不是RST,SOI,EOI,TEM的标记(通过FF01FFFE,减去上面的异常):在标记之后,读取接下来的2个字节,这是该帧头的16位大端长度(不是包括2字节标记,但包括长度字段)。跳过给定的数量(通常长度减去2,因为您已经获得了这些字节)。
  • 如果在EOI之前出现文件结尾,则表示图像已损坏。
  • 收到EOI后,您就可以浏览JPEG,并且应该具有长度。如果您希望流中包含多个JPEG,则可以通过读取另一个SOI重新开始。
  • 关于size - 确定JPEG(JFIF)图像的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557071/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com