- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任何 libexif 用户/开发人员都可以为我指出正确的方向,说明在 JPG 图像的 exif 元数据中添加小型自定义 XML 文档的适当调用是什么?
我已经在谷歌上搜索了一段时间,但无法弄清楚。
我对任何其他允许我这样做的开源库持开放态度,只要它是基于 C 的。
最佳答案
您可以将任何数据嵌入到 JPG 的 EXIF 数据 block 中。据我所知,没有大小限制,如果需要,您只需将其拆分为多个 EXIF 数据 block 。
您甚至不需要 libexif。您可以通过编程方式执行以下操作,在 C 代码中手动完成这一切(请注意,这仅适用于已经包含其他 EXIF 数据的 JPG 文件):
基本上你的 JPG 文件(如果它已经有一个 EXIF 标题)将以这样的开头:
0xFF 0xD8
那么第一个 Exif header 将以此开头:
0xFF 0xE0
接下来是Exif数据 block 的长度,这里是两个字节:
0x00 0x10 //In this case it is 16 bytes (0x0010) long and it INCLUDES these two bytes of the header
接下来是 Exif 数据 block 的实际数据(您的可能不同)。请注意,它是 14 个字节长(或 14+2 = 16 个字节,或如上所示的 0x0010):
0x4A 0x46 0x49 0x46 0x00 0x01 0x01 0x01 0x00 0x60 0x00 0x60 0x00 0x00
现在您可以在此 header 之后插入您的 XML Exif 数据 block ,该 header 以 exif 数据标识符(始终相同)开头:
0xFF 0xE1
然后您的 XML 文件的大小(以字节为单位)+ 2(请注意,如果您的文件的大小大于 0xFFFE,那么您必须将其拆分为多个 EXIF 数据 block ):
0x07 0x7D //In this case it is 1917bytes long or 0x077D
然后此时将您的 xml 直接插入到 JPG 中,并保持文件的其余部分不变。
请参阅下图以获得直观的解释(如果看不懂,只需右键单击并查看图像):
这是我的 JPG,其中包含我的虚拟 XML 文件。右键单击,保存,在十六进制编辑器中打开它并自己寻找:
Sample JPG with XML in EXIF data block
最后只需检查您是否仍然可以打开 JPG,如果可以,您就成功了。
这是一个用 C++ 编写的简单示例(请注意,我没有调试代码,只是从内存中编写的,所以请注意!):
char yourdata[]="<xml> contents to </add>";
long yourdatalen = 0x18;
//open file
char * file;
long filelen=0;
std::ifstream infile;
infile.open("yourjpg.jpg",std::ios::binary| std::ios::in);
//find size of file
infile.seekg (0, ios::end);
filelen = infile.tellg();
infile.seekg (0, ios::beg);
//read contents of file
file = new char [filelen];
infile.read(file,filelen);
infile.close();
//lets parse through the file and find any exif headers
long x=0;
if ((file[0]==0xFF) && (file[1]==0xD8)){
//all good lets go!!
while ((file[x]!=0xFF) && (file[x+1]!=0xE1)) {
x++;
}
//were at the first EXIF data block! insert XML here
char * temp=file;
file = new char [filelen+yourdatalen+4];
memcpy(file,temp,x);
file[x+0]=0xFF;
file[x+1]=0xE1;
file[x+2]=int((yourdatalen+2)/0xFF); //note assumes that your xml file is less than 0xFFFE bytes long
file[x+3]=yourdatalen-int((yourdatalen+2)/0xFF);
memcpy(&file[x+4],yourdata,yourdatalen);
memcpy(&file[x+4+yourdatalen],temp[x],filelen-x);
delete [] temp;
//Save to file
std::ofstream ofile;
ofile.open("savejpg.jpg",std::ios::binary| std::ios::out);
ofile.write(file,yourdatalen+4+filelen);
ofile.close();
}
else {
//JPG file does not have exif data in it, you'll need to add it first or find another way of adding your data
}
//Clean up
delete [] file;
我使用的是 HxD,但您可以使用任何十六进制编辑器。
关于c - libexif 示例在 exif 数据中添加一个小的 Xml 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2045113/
我在我的 C/gtk+ 应用程序中使用 libexif。但我想让它成为可选的。我必须在配置文件中写入什么才能执行此操作? 谢谢 最佳答案 可以查看条件编译here 。并在这些标志下定义调用。 关于c
我正在编写一个基于 Python 的 [web] 应用程序,需要能够读取和写入 EXIF 数据。 libexif似乎拥有所有正确的成分,但我无法弄清楚如何(或是否)可以使用Python的ctypes
我有一个使用此处找到的 libexif C 库的程序 http://libexif.sourceforge.net/ 我安装了这个库,它位于/usr/include/libexif 我把这些放在程序的
我的任务是编辑 exif 标签并向其添加特定于应用程序的值。如果 exif 标签存在,libexif 很乐意编辑它们。但如果 exif 标签不存在,我将不得不创建它们并将它们附加到文件中。libexi
任何 libexif 用户/开发人员都可以为我指出正确的方向,说明在 JPG 图像的 exif 元数据中添加小型自定义 XML 文档的适当调用是什么? 我已经在谷歌上搜索了一段时间,但无法弄清楚。 我
我正在尝试使用 libexif 将 exif 数据写入 jpeg 文件。我非常关注随附的示例。我可以理解所有正在写入的 Exif 数据 block 和所有内容,但是如何按照他们的建议加载 jpeg 数
在我的 C 程序中,我想使用 libexif 和 libjpeg 在给定路径 inputFilePath,并将生成的 jpeg 保存到输出路径 outputFilePath。 输入的 jpeg 文件很
我是一名优秀的程序员,十分优秀!