gpt4 book ai didi

c - libexif 示例在 exif 数据中添加一个小的 Xml 文档

转载 作者:行者123 更新时间:2023-12-01 12:35:26 26 4
gpt4 key购买 nike

任何 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 中,并保持文件的其余部分不变。

请参阅下图以获得直观的解释(如果看不懂,只需右键单击并查看图像):

Example of XML file inserted into EXIF data of 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/

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