De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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);
}
}
?>