У меня есть коллекция фотографий, на которых нет информации о дате. У них нет данных Exif, а даты модификации файлов все идентичны. Единственная последовательность есть в имени файла: image-0001.jpg, image-0002.jpg и т.д.
Теперь я хочу присвоить этим файлам (желательно в Exif) дату с разницей в 10 секунд. Меня не так интересует, какими именно будут базовые дата и время, просто все они увеличиваются на 10 секунд. Таким образом, первое изображение получит 0:00:00, второе 0:00:10, третье 0:00:20 и т. д.
Возможно ли это с помощью ExifTool или других приложений Windows? Мы говорим о нескольких тысячах изображений, так что вручную об этом не может быть и речи ;-)
Подобный вопрос уже есть на форумах ExifTool. Это можно сделать с помощью двух последовательных команд ExifTool. Во-первых, убедитесь, что все даты совпадают
exiftool -datetimeoriginal='2015:02:22 00:00:00' DIR
И затем увеличивайте время на каждом
exiftool '-datetimeoriginal+<0:0:${filesequence}0' DIR
Эта команда создает файлы резервных копий. Добавить -overwrite_original
для подавления создания файлов резервных копий. Добавить -r
для рекурсии в подкаталоги. Если эта команда запускается под Windows CMD, замените одинарные кавычки на двойные.
Многие другие ответы здесь включают зацикливание и запуск exiftool один/два раза для каждого файла. Это распространенная ошибка Exiftool #3 . Самым большим ударом по производительности Exiftool является время запуска. При обработке тысяч изображений это значительно увеличит время обработки.
Поскольку в лучших ответах используется синтаксис, отличный от Windows, я опубликую здесь их код, преобразованный для Microsoft Windows.
Решение @StarGeek, очень быстрое и простое:
Сначала установите базовую метку времени для всех изображений:
exiftool -datetimeoriginal="2015:01:01 12:00:00" DIR
( DIR
это имя папки, содержащей все изображения.)
Затем назначьте добавочные временные метки:
exiftool "-datetimeoriginal+<0:0:${filesequence;$_*=3}" DIR
(В данном случае 3
это количество секунд, которое вы хотите между каждой фотографией.)
Обратите внимание на использование двойных кавычек, это необходимо в системах Windows.
Решение @junkyardsparkle, которое изначально было единственным, с которым я мог работать:
Это требует создания пакетного файла из-за задействованных команд.
@echo off
setlocal EnableDelayedExpansion
for %%f in (*.jpg) do (
echo %%f
rem Get filename
set n=%%f
rem Extract number
set n=!n:~6,4!
rem Interpret as decimal
set /a n=1!n!-10000
rem Convert to seconds
set /a n = n*10
rem Assign base timestamp
exiftool -DateTimeOriginal="2000:1:1 00:00:00" %%f
rem Assign time increment
exiftool -DateTimeOriginal+="00:00:!n!" %%f
)
Попробуйте Ирфанвью . Это бесплатное ПО (AFAIR) с очень гибкой системой пакетного переименования.
Кроме этого, я бы попробовал написать сценарий, что-то вроде
for X in $(seq -w 0 20) ; do
plus=$(expr $X \* 10)
exiftool -alldates+="0:0:0 0:0:$plus" image_$X.jpg
done
Первая строка создает цикл по числам в именах файлов, которые у вас есть, например. 00..20. Если у вас есть 1000 изображений, команда будет seq -w 0 1000
. Опция -w
добавляет ведущие нули к числам.
Вторая строка определяет приращение - в данном случае 10. Пока без единиц.
Строка формата в третьей строке «0:0:0 0:0:$plus» определяет, что $plus
означает переменная, в данном случае секунды. Если бы вам нужны были минуты, вы бы написали 0:0:0 0:$plus:0
. Формат "год:месяц:день час:минута:секунда". Итак, здесь у нас есть 10-секундный шаг.
Это пакет, выполненный в «bash» (оболочка Linux), возможно, вам придется адаптировать его для Windows или использовать живую систему Linux для преобразования.
Обратите внимание, что все файлы должны иметь (идентичный) тег Exif (DateTimeOriginal), прежде чем его можно будет использовать, поскольку он увеличивает только существующие теги. Но вы можете просто написать тег одной командой exiftool.
Я протестировал это с 20 примерами файлов, и теги были написаны правильно.
Что ж, я не опубликовал свой ответ на bash, потому что вопрос конкретно касался решения для Windows, но, поскольку это сделали два других человека, вот что я придумал:
for file in *.jpg
do
exiftool -DateTimeOriginal="1111:11:11 00:00:00" $file
exiftool -DateTimeOriginal+="00:00:${file:6:4}0" $file
done
Избегает путаницы с командой даты. :)
Обратите внимание, что в той части, где указано ${file:6:4}
, «6» представляет точку в имени файла, с которой начинается порядковый номер, а «4» представляет длину этой последовательности. Если ваши файлы точно соответствуют «image-0001.jpg, image-0002.jpg», указанным в вопросе, это будет работать как есть; в противном случае отрегулируйте, чтобы соответствовать.
Саару Линдестокке
матдм
$filesequence
волшебная переменная exiftool; в Junkyardsparkle$file
это переменная bash. Это более портативно; другой связывает время с именем файла, а не с порядком, в котором exiftool их читает.свалкаблеск
Питер
exiftool "-datetimeoriginal+<0:0:$filesequence" image-0010.jpg
(в формате DOS), но результат "0 файлов изображений обновлено, 1 файл изображений не изменен"Питер
матдм
$filesequence
начинается с 0. Когда у вас есть только один файл, он всегда устанавливается только на 0, что делает все это бесполезным. Это должно работать, если у вас есть целый каталог файлов.матдм
'
vs"
имеет большое значение - с двойными кавычками$
будет поймано и интерпретировано оболочкой (как в ответе Йенса), но в этом ответе это должна быть одинарная кавычка, чтобы ExifTool интерпретировал ее внутри.свалкаблеск
СтарГик
-datetimeoriginal+<0:0:${filesequence;$_*=3}
(требуются фигурные скобки). В этот момент вы начинаете использовать расширенное форматирование и подсовываете туда некоторый код Perl.СтарГик
Питер
"
вместо'
. Но теперь работает идеально!