Migração em massa de dados GPS EXIF (também para o iPhoto)

0

Estou tentando mover minha biblioteca de fotos (mais de 12000) do iPhoto para uso no Adobe Lightroom e gostaria de incluir os dados de GPS que adicionei às fotos usando o recurso no aplicativo do iPhoto (Esses dados são armazenados no banco de dados proprietário da Apple, não como metadados na própria foto). Posso transferir os dados exportando, mas quero os arquivos RAW originais que o iPhoto não modifica. Então, minha solução proposta é esta:

1) Exporte todas as fotos RAW originais para uma árvore de diretórios classificada por nome de evento. 2) Exporte todas as fotos como JPEGs com os dados do GPS incorporados nos dados EXIF (como o iPhoto pode fazer). 3) Use "exiftool" para puxar os dados do GPS do jpeg e copie-os para o arquivo raw correspondente.

Eu posso fazer # 3 uma foto por vez com o seguinte comando:

exiftool -overwrite_original_in_place -tagsFromFile ~/Photos-Mod/Event001/photo001.jpg -gps:all ~/Photos-Orig/Event001/photo001.NEF

Os arquivos de fotos-modificação têm os dados de GPS do iPhoto e o Photos-Orig não. A árvore de diretórios e os nomes dos arquivos serão idênticos, exceto pelo nome do diretório principal e a extensão do arquivo (em alguns casos, meu original também é um jpeg). Espero que exista uma boa maneira de criar um script que possa executar o exiftool nos arquivos modificados do iPhoto no diretório pai Photos-Mod e mover os dados do GPS para o arquivo original do nome do arquivo e do diretório de eventos correspondentes nas Fotos. -Origir diretório pai.

Eu simplesmente não tenho as habilidades de script. Qualquer ajuda aqui seria quente.

    
por Ben Gross 30.04.2013 / 23:41

1 resposta

0

O problema consiste nas seguintes partes:

  1. Encontre todas as fotos no diretório Photos-Mod
  2. Encontre cada foto correspondente em Photos-Orig
  3. Invoque exiftools com argumentos corretos

Encontrar todas as fotos

Isso é fácil usando uma expressão glob como ~/Photo-Mod/*/* .

Encontrando a foto correspondente

Dado um caminho completo, podemos substituir o Photo-Mod por Photo-Orig . Além disso, alteramos a extensão do arquivo para * , para que tenhamos outra expressão glob. Se essa glob não corresponder a nenhum arquivo, imprimiremos uma mensagem de erro, mas simplesmente continuaremos.

Invocando exiftools agora é fácil.

Uma solução de bash

Recapitulação rápida da sintaxe de Bash:

  • Foreach-loops:

    for variable in EXPR; do
      COMMANDS;
    done
    
  • If-else:

    if COND; then
      COMMANDS;
    else
      COMMANDS;
    fi
    
  • Filetests: [ -e $file ] ( -e testes para a existência de arquivos)

  • Atribuições de variáveis
  • : var=$(COMMANDS) .

Podemos usar expressões regulares via sed .

# There are probably more elegant ways, but I don't know much bash
for mod in ~/Photo-Mod/*/*/*; do
  orig=$(echo $mod | sed -e 's/Photo-Mod/Photo-Orig/;s/\.[^.]*$/.*/');
  orig=($orig); # Apply the glob expression, select result
  if [ -e $orig ]; then
    exiftool -overwrite_original_in_place -tagsFromFile "$mod" -gps:all "$orig";
  else
    echo "No corresponding file for $mod found. Skipping!" >&2;
  fi;
done

Isso pode ser executado diretamente na linha de comando, removendo todas as novas linhas. Você também pode colocá-lo em um shell script e chamá-lo de lá.

( Nota: testado com expressões glob semelhantes e sem exiftools na bash do GNU)

Uma solução Perl

Introdução rápida à sintaxe do Perl:

  • Foreach-loops:

    for my $variable (LIST) {
      COMMANDS
    }
    
  • If-else:

    if (COND) {
      COMMANDS
    } else {
      COMMANDS
    }
    
  • Filetests: -e $filename

  • Atribuições de variáveis
  • : my $var = EXPR;

As expressões regulares fazem parte do idioma e podem ser aplicadas por $var =~ /REGEX/ .

use strict; use warnings; # helps us write better scripts
use autodie; # automatic error handling

for my $mod (glob '~/Photo-Mod/*/*/*') {
  my $orig = $mod;
  $orig =~ s/Photo-Mod/Photo-Orig/;
  $orig =~ s/\.[^.]*$/.*/;
  if (($orig) = glob qq("$orig")) { # implicitly tests for existence
    system 'exiftool', '-overwrite_original_in_place',
      '-tagsFromFile', $mod, '-gps:all', $orig;
  } else {
    warn "No corresponding file for $mod found. Skipping!\n";
  }
}

Você pode despejar o código em um arquivo e invocá-lo com perl script.pl . Ou você pode usar um aqui-doc:

$ perl <<'END'
# The code goes here
END

( Nota: Os scripts em Perl foram testados com perls v16.3 e v14.2 no Linux.)

    
por 01.05.2013 / 20:38