Мне нужно оптимизировать этот код. В настоящее время этот код работает. Я могу извлечь тег datetimeoriginal из файла с помощью инструмента extern «exiftool». Но это слишком медленно, когда этот процесс повторяется. Есть ли способ извлечения этой информации в переменных напрямую?
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();
...
}
Извините за мою грамматику, я не являюсь носителем английского языка.
Есть ли способ извлечения этой информации в переменных напрямую?
Да, это возможно.
Вы можете либо найти и использовать библиотеку, которая может прочитать информацию 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 до тех пор, пока не закончите, но это поможет, если вы сбросите все буферы после каждого -execute.