shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] script para datar fotos


From: Julio C. Neves
Subject: Re: [shell-script] script para datar fotos
Date: Sun, 1 Feb 2009 03:58:05 -0200

Aê China,
como te disse no e-mail anterior, estou estudando a fundo a suite
ImageMagick para escrever um arrtigo ou, quem sabe, um livro.

Eis que me deparei com seguinte faceta do utilitário identify, que faz parte
da suíte, e que é pouquíssimo conhecido. Veja seu comportamento básico:

$ identify ArraialDoCabo4.jpg
ArraialDoCabo4.jpg JPEG 300x225 300x225+0+0 DirectClass 8-bit 16.9883kb

Mas se eu pedir algo mais verbose, veja:

$ identify -format "%[EXIF:*]" ArraialDoCabo4.jpg
exif:ApertureValue=128/32
exif:ColorSpace=65535
exif:ComponentsConfiguration=...
exif:CompressedBitsPerPixel=5/1
exif:Compression=6
exif:CustomRendered=0
exif:DateTime=2004:12:07 14:15:50
exif:DateTimeDigitized=2004:10:28 10:22:49
exif:DateTimeOriginal=2004:10:28 10:22:49
exif:DigitalZoomRatio=2592/2592
exif:ExifImageLength=225
exif:ExifImageWidth=300
exif:ExifOffset=204
exif:ExifVersion=0220
exif:ExposureBiasValue=0/3
exif:ExposureMode=0
exif:ExposureTime=1/1250
exif:FileSource=.
exif:Flash=24
exif:FlashPixVersion=0100
exif:FNumber=40/10
exif:FocalLength=230/32
exif:FocalPlaneResolutionUnit=2
exif:FocalPlaneXResolution=2592000/283
exif:FocalPlaneYResolution=1944000/212
exif:JPEGInterchangeFormat=1046
exif:JPEGInterchangeFormatLength=2106
exif:Make=Canon
exif:MaxApertureValue=64/32
exif:MeteringMode=5
exif:Model=Canon PowerShot G5
exif:Orientation=1
exif:ResolutionUnit=2
exif:SceneCaptureType=0
exif:SensingMethod=2
exif:ShutterSpeedValue=329/32
exif:Software=Adobe Photoshop 7.0
exif:WhiteBalance=0
exif:XResolution=72/1
exif:YResolution=72/1

Puxa, aí tem até a câmera que eu tinha à época (Opção Make) e o modelo
(opção Model), mas o que interessa é a opção DateTime. Então vamos fazer
assim:

$ identify -format "%[EXIF:*]" ArraialDoCabo4.jpg | grep :DateTime=
exif:DateTime=2004:12:07 14:15:50

Assim sendo, podemos fazer algo assim:

$ identify -format "%[EXIF:*]" ArraialDoCabo4.jpg | sed -r
'/:DateTime=/!d;s#.*=([0-9]{4}):([0-9]{2}):([0-9]{2}).*#\3/\2/\1#'
07/12/2004

Então seu script seria algo assim:

Erro=0
for Foto in *.jpg
do
    Data=$(identify -format "%[EXIF:*]" "$Foto" |
        sed -r
'/:DateTime=/!d;s#.*=([0-9]{4}):([0-9]{2}):([0-9]{2}).*#\3/\2/\1#')
    [ "$Data" ] || {
        echo Foto $Foto sem exif
        Erro=1
        }
    montage -frame 5 -geometry +0+0 -label $Data \
        -font Impact-Normal -pointsize 25 -fill Blue \
        -stroke orange -background none -mattecolor DodgerBlue \
        "$Foto" "$Foto"OK.png
done
-- 
Abração,
Julio
*Cursos de Shell e Zenity nos finais de semana:
- Em SP ligue (11) 2125-4747;
- Em DF ligue (61) 3223-3000;
- No RJ brevemente;
- Turmas fechadas em outras cidades ligue (21) 8112-9988

*
2009/1/30 china <address@hidden>

>   Caros;
>
> Retomando a tarefa depois das férias, e agora mais motivado ainda
> pelas zilhares de fotos tiradas :-)
>
> Matutando sobre a questão, vi que não estava pegando a data da foto,
> mas sim do arquivo, que refletia o timestam de gravação no filesystem.
> Ainda bem que o comando 'cp' preservou as datas de criação no cartão
> de memória, mas não dá para confiar nisso ...
>
> Então descobri o programa 'exiftime', que lê o metadado da foto e
> revela a data em que ela foi tirada, assim fica mais fidedigno :-D
>
> usando o comando 'exiftime -td pessoal/Fotos/*.jpg' ele retorna o seguinte:
> [...]
> pessoal/Fotos/banheiro_012.jpg:
> Image Digitized: 2008:08:10 21:33:55
>
> pessoal/Fotos/banheiro_013.jpg:
> Image Digitized: 2008:08:10 21:34:04
>
> pessoal/Fotos/galo.jpg:
> Image Digitized: 2007:09:07 10:44:17
> [...]
>
> Ou seja, lista todas as fotos e mostra a data e hora de criação.
>
> O que tentei fazer:
>
> for img in $(exiftime -td *.jpg); do
> convert -font helvetica -fill white -stroke black -pointsize 12
> -draw 'text 2200,1900 "$img"' ${img}datada.jpg
> done
>
> Então retorna o erro como no exemplo:
>
> 'convert: missing an image filename `10:44:17datada.jpg'.'
>
> e não processa nada, apenas criando os arquivos em vazios. Creio que o
> problema está na passagem do nome do arquivo para o convert.
>
> O que acham? Alguém tem uma luz para destara esse nó?
>
> PS: Numa de minhas buscas encontrei diversos softwares que fazem
> gravação de data nas fotos, mas todos proprietários e feitos apenas
> para windowz. O f-spot que vem no Ubuntu lê estes metadados e organiza
> as fotos em pastas justamente pela data de criação, mas não tem a
> opção de gravar a data na foto.
>
> 2008/12/19 chinabhz <address@hidden <china.listas%40gmail.com>>:
> > Caros;
> > Tenho uma câmera digital que não tem a função de gravar a data nas
> > fotos (sic)!
> > Daí me surgiu a idéia de criar um script que pega a data do arquivo da
> > foto e a escreve no arquivo. Não tenho conhecimento suficiente para
> > concluir a tarefa, por isso peço ajuda de vocês.
> >
> > O que já consegui:
> > 1) Usando o ls+awk consegui ler a pasta onde estão as fotos e retornar
> > apenas a data e hora de cada um
> > ls -lh * | awk {'print $6" "$7'}
> >
> > 2) usando o convert, do imagemagik, consegui gravar a data na foto em
> > UMA foto:
> >
> > convert -font helvetica -fill white -stroke black -pointsize 12 -draw
> > 'text 2200,1900 "datadafoto"' -stroke none -draw 'text 2200,1900
> > "datadafoto"' foto.jpg fotodatada.jpg
> >
> > O que preciso: que o scritp leia o diretório de fotos e corte apenas a
> > data e hora e passe como variavel para o convert fazer a datagem de
> > todas de uma vez, sendo que na linha de comando onde está foto.jpg
> > ficaria a variável que seria cada data de cada foto.
> >
> > Como minha câmera é muito comum, acredito que esse script seja de
> > interesse geral ... Tem como fazer??
> >
> > O que já fiz e não deu certo foi:
> >
> > #!/bin/bash
> > $fotos="ls -lh * | awk {'print $6" "$7'}"
> > for img in $fotos; do
> > convert -font helvetica -fill white -stroke black -pointsize 12 -draw
> > 'text 2200,1900 "datadafoto"' -stroke none -draw 'text 2200,1900
> > "datadafoto"' $img $imgdatada
> >
> >
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]