在变量中提取 C++ 图像的日期 exif
Extract dates exif of images at c++ in variables
我需要优化这段代码。目前,此代码有效。我可以使用外部工具 "exiftool" 在文件中提取 datetimeoriginal 标签。但是当重复这个过程时,这太慢了。有没有办法直接在变量中提取这些信息?
void image::add_info_creation_date(char *name_jpg){
//Execute exiftool in bash
stringstream ss;
ss << "exiftool.exe -datetimeoriginal -timezone images\" << name_jpg << " >> temporal.txt";
error = system(ss.str().c_str());
if (error != 0){
printf("The value returned was: %d.\n", error);
ss.clear();
exit(1);
}
ss.clear();
...
}
对不起我的语法,我的母语不是英语。
is there a way the extract this information in variables directly?
是的,有可能。
您的选择是要么找到并使用可以为您读取 EXIF 信息的库,要么阅读并理解 JPEG 和 EXIF 格式,然后自己读取文件。
由于快速搜索会找到几个执行这些操作的库,并且由于至少有一些文档可用于这两种标准,所以看起来并不难。
如果您自己阅读文件,请注意 JPEG 文件格式包含多个标记部分,包括图像及其元数据 - 您只需遍历这些部分,直到找到 EXIF 数据,然后对其进行解析。
为每个文件执行一次 ExifTool 可能会很慢,但是有一种方法可以 运行 它以便您可以向它提供命令流。首先,创建一个参数文件并保持打开状态以供输出;我们称它为 args.txt。然后启动
exiftool -stay_open True -@ args.txt
对于每个文件,写参数,每行一个参数,类似这样,args.txt:
-datetimeoriginal
-timezone
{filename}
-execute
完成后,将以下内容写入args.txt:
-stay_open
False
这可能会让您获得足够的性能。在你完成之前不要关闭 args.txt,但是如果你在每次执行后刷新任何缓冲区会有帮助。
我需要优化这段代码。目前,此代码有效。我可以使用外部工具 "exiftool" 在文件中提取 datetimeoriginal 标签。但是当重复这个过程时,这太慢了。有没有办法直接在变量中提取这些信息?
void image::add_info_creation_date(char *name_jpg){
//Execute exiftool in bash
stringstream ss;
ss << "exiftool.exe -datetimeoriginal -timezone images\" << name_jpg << " >> temporal.txt";
error = system(ss.str().c_str());
if (error != 0){
printf("The value returned was: %d.\n", error);
ss.clear();
exit(1);
}
ss.clear();
...
}
对不起我的语法,我的母语不是英语。
is there a way the extract this information in variables directly?
是的,有可能。
您的选择是要么找到并使用可以为您读取 EXIF 信息的库,要么阅读并理解 JPEG 和 EXIF 格式,然后自己读取文件。
由于快速搜索会找到几个执行这些操作的库,并且由于至少有一些文档可用于这两种标准,所以看起来并不难。
如果您自己阅读文件,请注意 JPEG 文件格式包含多个标记部分,包括图像及其元数据 - 您只需遍历这些部分,直到找到 EXIF 数据,然后对其进行解析。
为每个文件执行一次 ExifTool 可能会很慢,但是有一种方法可以 运行 它以便您可以向它提供命令流。首先,创建一个参数文件并保持打开状态以供输出;我们称它为 args.txt。然后启动
exiftool -stay_open True -@ args.txt
对于每个文件,写参数,每行一个参数,类似这样,args.txt:
-datetimeoriginal
-timezone
{filename}
-execute
完成后,将以下内容写入args.txt:
-stay_open
False
这可能会让您获得足够的性能。在你完成之前不要关闭 args.txt,但是如果你在每次执行后刷新任何缓冲区会有帮助。