将大量自定义数据添加到 jpg 图像文件
Adding big junks of custom data to jpg image file
我想知道是否有一种明显而优雅的方法可以向 jpeg 添加额外的数据,同时保持标准图像查看器的可读性。更准确地说,我想在其中嵌入一张(扫描的)照片背面的图片。老照片的背面通常会有个人信息,可能是日期或一些注释。当然,您可以使用 EXIF 并添加一些文本,但更可取的是背面的实际图像。
当然,我也可以保存 2 个文件 xyz.jpg 和 xyz_back.jpg,或者将两个图像并排排列,始终在一张照片中可见,但这不是我想要的。
这是可能的并且已经完成,就像在三星 Note 2 和 3 上一样,您可以将手写笔记添加到您拍摄的照片中作为图像。或者一些智能手机允许将录音嵌入到图像文件中,同时保持这些文件在其他设备上的可读性。
一个有趣的问题。有些文件格式支持每个文件包含多个图像(想到多页 TIFF),但 JPEG 本身不支持此功能。
JPEG 文件格式的一个特点是APP 段的概念。这些是 JPEG 文件的区域,可以包含任意信息(作为字节序列)。 Exif实际上存储在这些段之一中,并由前导码标识。
看看这个页面:http://www.sno.phy.queensu.ca/~phil/exiftool/#JPEG
你会在那里看到许多以APP
开头的段,例如APP0
(可以存储JFIF数据),APP1
(可以包含Exif)等等。
没有什么能阻止您将数据存储在其中一个网段中。兼容 JPEG 的阅读器将忽略这些无法识别的数据,但您可以将软件写入其中的 store/retrieve 数据。甚至可以在这样的片段中嵌入另一个 JPEG 文件!然而,据我所知没有这样做的先例。
另一种选择是将第二张图片作为第一张图片的缩略图。通常缩略图很小,但您可以将第二张图像存储为第一张图像的缩略图。不过有些软件可能会替换或删除它。
一般来说,我认为使用两个文件和一个命名约定是最简单和最不容易混淆的,但您确实有选择。
有两种方法可以做到这一点。
1) 使用和应用标记 (APP0–APPF)——首选方法
2) 使用注释标记 (COM)
如果您使用 APPn 标记:
1) 不要让它成为文件中的第一个 APPn。每个已知的 JPEG 文件格式都希望在 SOI 标记之后有某种格式特定的 APPn 标记。确保你的标记不在那里。
2) 在数据的开头放置一个唯一的应用程序标识符(以空结尾的字符串)(按照惯例)。
各种应用程序都以这种方式存储额外的数据。
一个问题是长度字段只有 16 位(Big Endian 格式)。如果您有大量数据,则必须将其拆分为多个标记。
如果您使用 COM 标记,请确保它位于文件中第一个 APPn 标记之后。但是,我不鼓励对此类内容使用 COM 标记,因为它可能会阻塞试图显示内容的应用程序。
我想知道是否有一种明显而优雅的方法可以向 jpeg 添加额外的数据,同时保持标准图像查看器的可读性。更准确地说,我想在其中嵌入一张(扫描的)照片背面的图片。老照片的背面通常会有个人信息,可能是日期或一些注释。当然,您可以使用 EXIF 并添加一些文本,但更可取的是背面的实际图像。 当然,我也可以保存 2 个文件 xyz.jpg 和 xyz_back.jpg,或者将两个图像并排排列,始终在一张照片中可见,但这不是我想要的。 这是可能的并且已经完成,就像在三星 Note 2 和 3 上一样,您可以将手写笔记添加到您拍摄的照片中作为图像。或者一些智能手机允许将录音嵌入到图像文件中,同时保持这些文件在其他设备上的可读性。
一个有趣的问题。有些文件格式支持每个文件包含多个图像(想到多页 TIFF),但 JPEG 本身不支持此功能。
JPEG 文件格式的一个特点是APP 段的概念。这些是 JPEG 文件的区域,可以包含任意信息(作为字节序列)。 Exif实际上存储在这些段之一中,并由前导码标识。
看看这个页面:http://www.sno.phy.queensu.ca/~phil/exiftool/#JPEG
你会在那里看到许多以APP
开头的段,例如APP0
(可以存储JFIF数据),APP1
(可以包含Exif)等等。
没有什么能阻止您将数据存储在其中一个网段中。兼容 JPEG 的阅读器将忽略这些无法识别的数据,但您可以将软件写入其中的 store/retrieve 数据。甚至可以在这样的片段中嵌入另一个 JPEG 文件!然而,据我所知没有这样做的先例。
另一种选择是将第二张图片作为第一张图片的缩略图。通常缩略图很小,但您可以将第二张图像存储为第一张图像的缩略图。不过有些软件可能会替换或删除它。
一般来说,我认为使用两个文件和一个命名约定是最简单和最不容易混淆的,但您确实有选择。
有两种方法可以做到这一点。
1) 使用和应用标记 (APP0–APPF)——首选方法
2) 使用注释标记 (COM)
如果您使用 APPn 标记:
1) 不要让它成为文件中的第一个 APPn。每个已知的 JPEG 文件格式都希望在 SOI 标记之后有某种格式特定的 APPn 标记。确保你的标记不在那里。
2) 在数据的开头放置一个唯一的应用程序标识符(以空结尾的字符串)(按照惯例)。
各种应用程序都以这种方式存储额外的数据。
一个问题是长度字段只有 16 位(Big Endian 格式)。如果您有大量数据,则必须将其拆分为多个标记。
如果您使用 COM 标记,请确保它位于文件中第一个 APPn 标记之后。但是,我不鼓励对此类内容使用 COM 标记,因为它可能会阻塞试图显示内容的应用程序。