关于JPEG压缩中附加信息的事
再复习一下JPEG元数据的概念:图片元数据(metadata)是嵌入到图片文件中的一些标签。比较像文件属性,但是种类繁多。
常见的几种标准有:
EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号、镜头、曝光、图片尺寸等信息。
IPTC:比如图片标题、关键字、说明、作者、版权等信息。
XMP:由Adobe公司制定标准,以XML格式保存。用PhotoShop等Adobe公司的软件制作的图片通常会携带这种信息
XMP
和Exif
可以共用JPEG编码格式中APP1的标签位,因此要用"EXIF"和"XMP"标识符作为区分。
因此前文所写的将XMP写入APP4的方法是不对的,会导致无法重新读取到XMP元数据。
使用MagicExif
软件可以方便的查看JPEG中的信息。
/* Write the JPEG marker header (APP1 code and marker length) */
jpeg_write_m_header(cinfo, JPEG_APP0 + 1,
(unsigned int)(length + 9));
/* Write the marker identifying string "XMP" (null-terminated). We
* code it in this less-than-transparent way so that the code works even if
* the local character set is not ASCII.
*/
jpeg_write_m_byte(cinfo, 0x58);
jpeg_write_m_byte(cinfo, 0x4d);
jpeg_write_m_byte(cinfo, 0x50);
jpeg_write_m_byte(cinfo, 0x0);
/* Add the sequencing info */
jpeg_write_m_byte(cinfo, cur_marker);
jpeg_write_m_byte(cinfo, (int)num_markers);
APPn部分可以写入的最大数据是64KB,因此XMP如果写入了GDepth数据很容易超过APPn的大小限制。在这里参考高通的DebugData写入JPEG方式,已知DebugData的大小也是大于64KB,采用的是每一次都只写入64KB大小的数据(包含TAG),剩下的数据再按照相同的逻辑写入。具体实现在函数EmitAppN()
中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TApVI7Z8-1639108045022)(DocPic/image-20211207140735245.png)]
header的长度要和定义的“XMP”字符串的长度相同才行,不然会导致jpeg写不成功。
jpeg_write_m_header(cinfo, JPEG_APP0 + 3,
(unsigned int)(length + 4))