代码之家  ›  专栏  ›  技术社区  ›  José Ignacio Fernández

在变量中从c++中提取图像的exif日期

  •  0
  • José Ignacio Fernández  · 技术社区  · 9 年前

    我需要优化这个代码。目前,此代码有效。我可以使用外部工具“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();
    ...
    }
    

    对不起我的语法,我不是以英语为母语的人。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Useless    9 年前

    有没有办法直接在变量中提取这些信息?

    是的,这是可能的。

    您可以选择查找和使用一个可以为您读取EXIF信息的库,或者读取&理解JPEG&EXIF格式,并自己读取文件。

    由于快速搜索可以找到几个做这些事情的库,并且至少有一些文档可用于这两个标准,所以这似乎并不太难。

    如果您自己阅读该文件,请注意JPEG文件格式包含多个标记的部分,包括图像及其元数据-您只需要遍历这些部分,直到找到EXIF数据,然后进行解析。

        2
  •  0
  •   user1886876 user1886876    9 年前

    对每个文件执行一次ExifTool可能会很慢,但有一种方法可以运行它,这样您可以向它提供一系列命令。首先,创建一个参数文件,并将其打开以供输出;让我们称它为args.txt。然后启动

    exiftool -stay_open True -@ args.txt
    

    对于每个文件,将参数(每行一个参数)写入args.txt:

    -datetimeoriginal
    -timezone
    {filename}
    -execute
    

    完成后,将以下内容写入args.txt:

    -stay_open
    False
    

    这可能会给您带来足够的性能。不要关闭参数。txt,直到您完成,但如果您在每次执行后刷新任何缓冲区,这将有所帮助。