você está aqui: Home  → Arquivo de Mensagens

Organizando Fotografias com PHP Scripting

Colaboração: Otávio Corrêa Cordeiro

Data de Publicação: 31 de Julho de 2005

Já participei de alguns fóruns sobre fotografia e uma pergunta sempre estava presente: "Como vocês organizam suas fotografias?" ou suas variantes, como "Qual a melhor forma de organizar fotografias no micro?"

Nesta época eu havia comprado uma câmera digital com suporte a EXIF - Exchangeable Image File, que permite a câmera armazenar informações sobre a fotografia, como velocidade do obturador, tempo de exposição e data de quando a foto foi tirada - e resolvi criar um script em PHP para organizar as novas fotografias da forma que fazia, antes, manualmente.

A idéia deste texto é apresentar uma forma de organizar fotografias e mostrar que o PHP pode ser usado para outras tarefas além de páginas web, como scripts de console para o dia-dia.

Organização

Sempre armazenei minhas fotografias em diretórios referente a data em que foram tiradas, no seguinte formato: ANO-MÊS-DIA. Desta forma fica evidente que o diretório mais novo fica sempre abaixo dos demais.

  $ ls ~/Pictures
  2004-12-24
  2005-01-01
  2005-01-06

Logo o script deveria seguir na mesma linha.

PHP

Há quem não saiba, mas o PHP ser executado via console, bastando, para isso, seu caminho estar no $PATH (Dica válida também para o Windows). No debian:

  apt-get install php4-cli php4-common

onde php4-cli é o "command-line interpreter for the php4 script".

Testando o PHP

Para testar o PHP em console, basta escrever uma aplicação simples como a seguinte:

  #!/usr/bin/php
  <?php
  if($argc == 1) {
     // Mostra um help...
     print "Uso: ". $argv[0] ." Seu_Nome\n";
  } else {
     // Faz o tratamento da string de argumentos...
     $saida = "Ola, ";
     for($i=1; $i<$argc; $i++) {
         $saida .= $argv[$i] . " ";
     }
     print $saida . "\n";
  }
  ?>

e para executar

  $ php foobar.php Otavio Cordeiro
  Ola, Otavio Cordeiro
  $

Organizando Fotografias

Com o PHP funcionando, deve-se copiar o script que segue abaixo ou copiar direto da web:

  $ wget http://otavio.geek42.org/pr0n/ExifOrganizer/ExifOrganizer.txt
  $ mv ExifOrganizer.txt ExifOrganizer.php
  $ chmod +x ExifOrganizer.php

e fazer uma pequena modificação na linha onde é definido o diretório onde as imagens serão criadas, ajustando para o seu diretório de preferência.

  $localPictures = "/home/otavio/Pictures";

Uma vez configurado, basta entrar no diretório onde estão as imagens baixadas pelo software de aquisição de imagens - como gphoto2 - e executar, por exemplo:

  php ExifOrganizer.php *jpg

O Script apaga a fotografia original do diretório onde estava deixando apenas uma cópia no novo destino. Para evitar a deleção, basta retirar, nas duas linhas onde é chamada, a função unlink($fileName).

Script

  #!/usr/bin/php
  <?php
  
  /*
  Copyright (C) 2005 - Otávio Corrêa Cordeiro
  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.
  
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  */
  
  function moveFile($fileName){
     $localPictures = "/home/otavio/Pictures";
  
     // Garante que a verificacao do suporte a EXIF do PHP.
     // O suporte é dado na compilação do PHP: --enable-exif
     if(!extension_loaded(exif)) {
         print "Please, check your PHP instalation/compilation.\n";
         print "PHP should by compiled with --enable-exif option.\n";
         return;
     }
  
     // Verifica o tipo do arquivo.
     //$fileType =  mime_content_type($fileName);
     list($altura, $largura, $fileType) = getimagesize($fileName);
     if($fileType != "2") return;
  
     // Cria o EXIF da imagem e extrai a data da Fotografia
     $exif     = exif_read_data($fileName, 'EXIF');
     $capture_data = $exif['DateTimeOriginal'];
  
     // Reestrutura a string da data
     $capture_data = str_replace(" ", ":", $capture_data);
     $fileData     = explode(":", $capture_data);
     $fileData     = $fileData[0]."_".$fileData[1]."_".$fileData[2];
  
     if ($fileData == "--") return;
     // Verifica se existe o diretório para a data da imagem
     if(is_dir("$localPictures/$fileData")){
         // Em caso positivo, copia/move a imagem para ele.
         print $fileName .": using directory ". $fileData ."\n";
         if(copy($fileName, "$localPictures/$fileData/$fileName")) unlink($fileName);
     } else {
         // Senão, cria o diretório e copia/move a imagem para ele.
         print $fileName .": creating directory ". $localPictures . "/" . $fileData ."\n";
         mkdir("$localPictures/$fileData");
         if(copy($fileName, "$localPictures/$fileData/$fileName")) unlink($fileName);
     }
  
  }
  
  if($argc == 1) {
     // Mostra a ajuda.
     print "Usage: ". $argv[0] ." file01.jpg file02.jpg ...\n";
  } else {
     // Faz o tratamento da string e executa a funcao
     for($i=1; $i<$argc; $i++) {
         $imagem = $argv[$i];
         moveFile($imagem);
     }
  }
  
  ?>


 

 

Veja a relação completa dos artigos de Otávio Corrêa Cordeiro

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script