você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

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