domingo, 25 de novembro de 2012

Script para gerar thumbnails

Frequentemente crio cópias de segurança dos meus arquivos pessoais, gravando-as em mídias DVD. Realizo há anos este procedimento e o acervo de mídias já está na casa da centena.

O maior problema quando se tem uma quantidade enorme de dados é não ter um mecanismo de busca que facilite a recuperação de determinada informação. Quando a informação é um texto, fica mais fácil efetuar a busca, bastando uma pesquisa por palavra chave. Para fazer isso, existem diversos softwares. As ferramentas de busca em texto retornam a localização exata, não necessitando de uma busca com os próprios olhos.

Agora, em imagens, um mecanismo de busca torna-se bem mais complexo. Os programas de reconhecimento em imagens são específicos, buscando apenas padrões dentro de um certo contexto. Por exemplo, programas de reconhecimento facial não irão reconhecer uma paisagem ou uma casa. Além do mais, não existem softwares com estes recursos disponíveis para os usuários, o sistema operacional não traz isso, nem o Photoshop e o Corel Draw fazem isso. Para procurar uma imagem entre outras, a única forma é a busca com os próprios olhos. Abrem-se as imagens uma a uma para ver se é a que procura ou não.

O procedimento mais ágil de buscar imagens é exibi-las na forma de thumbnails. Os thumbnails são versões de tamanho reduzido das imagens, usados para ajudar no reconhecimento e organização. O mecanismo de busca do Google, na pesquisa de imagens, retorna uma página com os thumbnails. Os sistemas operacionais, por seus gerenciadores de arquivos, são capazes de exibir as miniaturas das imagens contidas em uma pasta. A ação de enxergar as imagens torna-se muito mais rápida.

Existem diversos softwares que podem gerar miniaturas de imagens, seja pra somente exibir em tela ou pra salvar os arquivos de tamanho reduzido. Eu particularmente utilizo um script pra ser executado no interpretador de comandos do Linux. Este script (seu código fonte está ao final deste artigo) faz uma varredura por todos os diretórios e subdiretórios, buscando arquivos com as principais extensões de arquivos de imagem. Depois gera as miniaturas e grava em outro local, além de gerar uma página em HTML com uma tabela para exibição dos thumbnails. Voltando ao início deste artigo, este script é para ser aplicado em mídias de backup, em meus CDs e DVDs. Mas nada impede de ser adaptado para outros locais de armazenamento.

Assim mantenho, em meu computador, uma pasta com todos os thumbnails das imagens que tenho em mídias óticas. Quando preciso localizar alguma, vasculho pelas miniaturas e descubro em qual CD/DVD está.

Eis o código fonte do script. Sugestões são sempre bem-vindas. Segue o conteúdo do arquivo "gerathumb.sh":


#!/bin/bash
#

CONT=1
COL=5
PER=$((100/COL))

[ $# -eq 0 ] && {
  echo "Gera thumbnails das imagens de um CD ou DVD."
  echo "Uso: gerathumb ### caminho"
  echo
  echo "   ###          numero do CD."
  echo "   caminho      local de montagem do CD."
  echo
  echo "Exemplo: gerathumb 034 /media/30082006/"
  exit 1
}

  if [ ! -e disco$1 ] && ln -s $2 disco$1 ; then
    if [ ! -f disco$1.html ] && [ > disco$1.html ] ]; then
      if mkdir disco-$1; then

        DISPOSITIVO=`mount | grep ${2%%?} | awk '{print $1}'`
        CDLABEL=`dd if=$DISPOSITIVO ibs=1 skip=32808 count=32 2>/dev/null`

        echo -e "<html>\n<head>\n<title>Imagens em disco$1</title>\n</head>\n<body>" > disco$1.html
        echo -e "<h2>Imagens em disco$1</h2>\n<p>\n<h4>Label do CD/DVD: ${CDLABEL%%  *}</h4>\n<hr>" >> disco$1.html
        echo "<table border=0 align=center width=100% cellspacing=2 cellpadding=2>" >> disco$1.html

        while read IMAGEM
        do

          NOME=`echo "${IMAGEM}" | sed 's/.*\///g'`
          NOMEURL=`echo "${NOME}" | sed 's/ /%20/g'`
          LOCAL=`echo "${IMAGEM}" | sed 's/^.\{2\}//; s/\//\/ /g; s/_/ /g; s/-/ /g'`

          if [ $CONT -eq 1 ]; then
            echo "<tr>" >> disco$1.html
          fi

          echo "<td align=center valign=top width=$PER%><img src=disco-$1/${NOMEURL}.jpg><br clear=all><font size=2 face=Arial>${LOCAL}</font></td>" >> disco$1.html

          if [ $CONT -eq $COL ]; then
            echo "</tr>" >> disco$1.html
            CONT=1
          else
            CONT=$((CONT+1))
          fi

          convert -thumbnail 180x180 -compress JPEG -quality 50 -delete 1--1 "$IMAGEM" disco-$1/"$NOME".jpg

        done < <(find ./disco$1/ -regextype posix-egrep -iregex '.*\.(jpg|jpeg|gif|png|tif|tiff|bmp|svg)' -type f -print)

        if [ $CONT -ne 1 ]; then
          for ((  i = $CONT;  i <= $COL;  i++  ))
          do
            echo "<td>&nbsp;</td>" >> disco$1.html
          done
          echo "</tr>" >> disco$1.html
        fi

        echo -e "</table>\n<hr>\n</body>\n</html>" >> disco$1.html
        rm -f disco$1
        echo -e "\nFeito!\n"

      else
        echo $?
        echo "Falha na criacao do diretorio."
        rm -f disco$1 disco$1.html
        exit
      fi
    else
      echo "Falha na criacao do arquivo HTML."
      rm -f disco$1
      exit
    fi
  else
    echo $?
    echo "Falha na criacao da ligacao."
    exit
  fi

Nenhum comentário:

Postar um comentário