Reduzindo imagens em lote automaticamente
Existem várias abordagens para conversão automática de formatos de fotos: arrastando-as para o ícone de um utilitário, detectando automaticamente sua gravação em determinado diretório, rodando diretamente um comando ou script na shell, etc. O Fernando Ebrahim, do IFTO, publicou no Dicas-L a sua solução: um script que roda na crontab (no caso dele, em um servidor de arquivos) e periodicamente reduz (com ajuda do venerável ImageMagick) o tamanho de todas as imagens colocadas em determinado diretório pelos usuários. (via dicas-l.com.br – “[Dicas-L] Reduzindo imagens em Lote”)
Cheguei a fazer um script semelhante mas que reduz as imagens por um raio (retamanho x.gif 2.0) ou reduz para um tamanho configurável (500k) — e.g. retamanho x.gif vai redimensionar a imagem até que ela tenha entre 470k e 500k. Se for gif, ele automaticamente otimiza com o gifsicle. Funciona com imagens animadas.
Pra quem se interessar ele está aqui; fiz em zsh, mas talvez funcione em bash: http://pastebin.com/equYuXbh
Eu uso aqueles nautilus-scripts (Que usa o imageMagick):
http://freecode.com/projects/resize-image-nautilus-script
Bem prático.
Infelizmente o imagemagick tem um problema incrível com performance. Durante um tempo testei na empresa os implementações do Magick++ (API em C++) do Imagemagick e do GraphicsMagick (fork do imagemagick que mantem boa compatibilidade dos comandos e API) e este teve uma performance, na conversão de imagens de diferentes formatos, de algumas dezenas de vezes, em vários casos.
Ao contrário do imagemagick, que é composto por vários executáveis, o graphicsmagick é um só executável (comando gm) onde o primeiro argumento é o utilitário desejado.
Ou seja, enquanto que no IM vc faz
$ convert imagem1.jpg imagem2.jpg
No GM vc faz:
$ gm convert imagem.jpg imagem2.jpg
Para imagens grandes (milhares de pixels de lado) o ganho de performance do GM faz toda diferença, mais ainda se vc tiver dezenas ou centenas delas.
Mas ainda desisti tanto do imagemagick quanto do graphicsmagick pois são extremamente lentos em relação ao ffmpeg. Como o que precisava era manipular frames de vídeos em tempo real, optei por ele (na verdade pelas suas bibliotecas, libav*).
Só como exemplo, enquanto uma imagem jpg demorava cerca de 600ms para ser convertida com o GM (e uns 2seg com o IM), o ffmpeg fazia em menos de 50ms. Ou seja, muito rápido.
Só tenho que confirmar se os números eram exatamente estes, pois não estou com os dados no momento. Mas era uma diferença absurda.
Ficou aí a minha dica.
O meu problema com o imagemagick não é o desempenho (“performance” no seu anglicismo), e sim que algumas GIFs animadas ele costuma zoar. Depois vou tentar o gm.
Já comparar com o ffmpeg é fora do alvo. O imagemagick tem um escopo bem diferente.
@Leandro Santiago,já testou assim? $ convert -quality 99 %03d.jpg,agora com redimencionamento $ convert *.jpg -resize 1920×1200! -quality 99 %03d.jpg
@Patola, o ffmpeg é capaz de fazer várias operações sobre imagens. Ele não trabalha só com áudio e vídeo. Sério. Dá pre redimensionar, converter, aplicar alguns filtros (como escrever na imagem, inverter cores, remover ruído, recortar, combinar diferentes imagens…), diminuir a qualidade, etc.
O pessoal do libav (fork do ffmpeg) mantém esta página, que é em boa parte compatível com o ffmpeg:
http://libav.org/libavfilter.html#Video-Filters
Pra usar um filtro, é só usar o parâmetro, no ffmpeg, -vf.
Tipo assim:
$ ffmpeg -i imagem.jpg -vf ‘negate,scale=iw/2:ih/2′ imagem.png -sameq
Isso converte uma imagem de jpg pra png, mantém a mesma qualidade e a imagem final tem metade do tamanho e as cores estão invertidas. Só o parâmetro -sameq que foi substituido por outro nas últimas versões. Só não lembro qual…
O esquema de filtros do ffmpeg é bastante poderoso, e vc pode criar filtros bastante complexos (na forma de um grafo), mas nunca me dei bem com estes mais complexos.
O problema é a documentação de boa parte disso não está bem documentada, exigindo que vc mergulhe em documentos obscuros para descobrir como faz.
@anderson, o comando que digitei não faz nada, só converte uma imagem para uma igual :-) O que quiz demonstrar é que no graphicsmagick todos os comandos estão reunidos num só executável (é tipo um busybox da vida :-)), quando no imagemagick existem vários executáveis que, ao meu ver, é uma abordagem ruim.
Novamente @Patola, que trauma que vc tem com anglicanismos, hein? Já pensou em procurar tratamento, meu filho? A língua é dinâmica e não muda por decreto, mas pelo próprio uso.
O objetivo da língua não é ser fiel a um acordo rígido. O acordo deve ser informal e serve unicamente para permitir que os indivíduos que o adotam sejam capazes de se comunicar. Se você entendeu, por meio das minhas palavras, o meu pensamento (expresso por palavras), a linguagem funcionou.
O próprio inglês evoluiu também com a incorporação de palavras e outras construções de vários tipos de línguas, como do latim e até do francês (como em resumé e fiancé).
@Leandro Santiago, eu só traduzi do seu anglicanismo. Perguntaria o mesmo a ti, qual o problema em usar palavras “nativas”? Por que dar predileção a uma importada? Por favor me recomende então algum doutor que trate de pessoas que se importam com a incorporação de palavras para conceitos já existentes em sua língua. Não sabia que era uma doença.
Quando à tarefa de tratamento em batch de imagens, o Linux Action Show mostrou uma aplicação muito interessante: Phatch – e está nos repositórios do Ubuntu!
@Patola, as vezes importamos por ser mais fácil. Não sei se isso vale para “performance” e “desempenho”, mas se houvesse uma palavra em outro idioma que representasse este conceito mas de uma forma mais fácil/enxuta e fosse compreendida por todos numa discussão, não veria problema algum no seu uso.
Na questão da predileção, meu comentário teve 231 palavras, sendo que somente 2 delas eram a palavra performance. O que dá ~0,9% do texto total. Não creio que isto represente um perigo à língua portuguesa.
hauahauha, mas porque mesmo estamos discutindo isso? :-)
por ego…
Eu costumo usar a linha de comando para lotes de imagens… Convert -resize AAAAxLLLL *.jpg
“falava demais e sempre queria ter a última palavra em qualquer discussão.
Como Eco fez o papel de distrair Hera enquanto Zeus se divertia com outras ninfas, ela recebeu um castigo. Perdeu o direito à própria voz, que tanto amava. Foi condenada a repetir eternamente a última palavra do que os outros falassem. (Marion Strecker)”
Narciso é um jovem magnífico que se apaixona pela própria imagem refletida na água. Acabou consumido pelo amor-próprio e se tornou o nome da flor encontrada onde ele desapareceu.
Somos todos Narcisos no Facebook, Orkut ou Instagram, quando publicamos fotos dos nossos sorrisos e melhores momentos.
Eco é uma ninfa que amava os bosques e os montes, mas tinha um defeito: falava demais e sempre queria ter a última palavra em qualquer discussão.
Como Eco fez o papel de distrair Hera enquanto Zeus se divertia com outras ninfas, ela recebeu um castigo. Perdeu o direito à própria voz, que tanto amava. Foi condenada a repetir eternamente a última palavra do que os outros falassem. (Marion Strecker)