Java 确切地说,在哪里;元数据“;JPEG原始块中的边界?

Java 确切地说,在哪里;元数据“;JPEG原始块中的边界?,java,javascript,c,image,jpeg,Java,Javascript,C,Image,Jpeg,我知道JPEG图像中有多种类型的“元数据”: 但是,我需要在哪里剪切字节数组才能将blob拆分为通用元数据部分和剩余的实际图像数据部分呢 我想保留所有元数据,调整图像大小,然后再次添加以前存储的元数据 什么是神奇的分隔符字节序列或位置 谢谢简短的回答是“视情况而定…”

我知道JPEG图像中有多种类型的“元数据”:

但是,我需要在哪里剪切字节数组才能将blob拆分为通用元数据部分和剩余的实际图像数据部分呢

我想保留所有元数据,调整图像大小,然后再次添加以前存储的元数据

什么是神奇的分隔符字节序列或位置

谢谢

简短的回答是“视情况而定…”

<这里有几个事情要考虑:

  • 严格地说,“jpeg”是对实际图像数据的编码,并没有指定我认为您需要的文件格式。常见的文件格式是JFIF或Exif,每种格式都允许不同类型的元数据
  • JFIF和Exif文件格式在元数据和图像数据之间没有完整的硬边界。例如,JFIF文件由许多段组成;几乎所有这些之后都有一些数据。Exif更为复杂,但遵循相同的原则。例如,有几个标记定义为APP0…APPn。许多程序/公司使用这些段对某种形式的元数据进行编码。每个段标记后面是两个字节的长度字段,后面是最多64K的数据(以长度字段的两个字节为界)
  • 可以有任意数量的字段用于指定元数据
  • 从技术上讲,这些字段可以出现在文件中的任何位置,尽管它们通常只出现在“图像数据”之前
  • 术语“图像数据”非常松散。我相信你所说的“图像数据”实际上也分布在许多不同类型的片段中。作为一个简单的示例,有Huffman编码表段(以段标记0xFFC4开始)和实际扫描数据段(以段标记0xFFDA开始)。我认为有充分的理由认为这些片段都是“图像数据”
  • 我远不是这些格式的专家,但不幸的是,我认为答案比你希望的要复杂得多。如果您想读取所有非图像数据信息,您确实需要解析整个图像文件。好消息是,我确信必须要有库才能做到这一点(尽管我不知道JS库)

    这是严重的过度简化,但它只是想给你一个想法,你需要研究

    -编辑-一些参考资料:

    简短的回答是“视情况而定…”

    <这里有几个事情要考虑:

  • 严格地说,“jpeg”是对实际图像数据的编码,并没有指定我认为您需要的文件格式。常见的文件格式是JFIF或Exif,每种格式都允许不同类型的元数据
  • JFIF和Exif文件格式在元数据和图像数据之间没有完整的硬边界。例如,JFIF文件由许多段组成;几乎所有这些之后都有一些数据。Exif更为复杂,但遵循相同的原则。例如,有几个标记定义为APP0…APPn。许多程序/公司使用这些段对某种形式的元数据进行编码。每个段标记后面是两个字节的长度字段,后面是最多64K的数据(以长度字段的两个字节为界)
  • 可以有任意数量的字段用于指定元数据
  • 从技术上讲,这些字段可以出现在文件中的任何位置,尽管它们通常只出现在“图像数据”之前
  • 术语“图像数据”非常松散。我相信你所说的“图像数据”实际上也分布在许多不同类型的片段中。作为一个简单的示例,有Huffman编码表段(以段标记0xFFC4开始)和实际扫描数据段(以段标记0xFFDA开始)。我认为有充分的理由认为这些片段都是“图像数据”
  • 我远不是这些格式的专家,但不幸的是,我认为答案比你希望的要复杂得多。如果您想读取所有非图像数据信息,您确实需要解析整个图像文件。好消息是,我确信必须要有库才能做到这一点(尽管我不知道JS库)

    这是严重的过度简化,但它只是想给你一个想法,你需要研究

    -编辑-一些参考资料:


    我的回应是澄清一些事情。JPEG标准是无法实现的。例如,它定义了如何对组件进行编码和解码,但没有定义组件是什么。JFIF是第一种常用于填补空白的JPEG文件格式

    如果我们将元数据定义为解码压缩图像不需要的所有描述性数据;数据和元数据之间有一个相当清晰的界限。在大多数情况下,任何APPn或COM标记都是元数据

    我之所以这么说,很大程度上是因为仅仅存在一个JFIF APP0标记就告诉解码器,图像要么是灰度的,要么是YCbCr格式的,未进行伽马校正。JFIF(缩略图、像素密度)中实际上几乎没有元数据

    JFIF和EXIF流的结构仅在定义格式的APPn标记的格式上不同。由于APPn标记包括长度,解码器可以跳过标记而不读取任何元数据。换句话说,JPEG解码器只需要知道它遇到了JFIF APP0标记或EXIF APP1标记来解码图像,而不需要读取这些标记中的数据

    EXIF比JFIF更复杂的情况只发生在APPn标记中。同样,解码器可以通过跳过标记忽略这种复杂性

    JFIF要求流以SOI ma开头