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

标签 c jpeg exif libexif

任何 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/

相关文章:

c++ - 从 JFIF/EXIF (JPEG) header 获取实际图像分辨率?

android - 将 JPEG 字节数据转换为原始灰度字节信息的最快方法是什么?

c - 彼得森算法的错误

c - 如何将 argv[k] 变成另一个字符串?

python - 写入文件夹时文件更改

java - 在android中使用 picasso 从图像中读取EXIF数据

ios - EXIF 的 PHContentEditingInputRequestOptions block 主线程

python - 如何在不使用 python 中的外部脚本的情况下从图像中读取 EXIF 数据?

c++ - 指针数组和指向指针数组的指针

c - 如果我向 fclose() 发送一个空指针会发生什么?