Como redimensionar várias imagens para o mesmo tamanho

7

Eu tenho vários arquivos de imagem em um diretório. Essas imagens são do mesmo tamanho e têm a mesma cor de fundo.

Como posso tornar todas as imagens do mesmo tamanho adicionando fundo como esta imagem anexada?

    
por ironsand 01.04.2014 / 17:20

3 respostas

10

Isso deve funcionar com todos os tipos de imagens que o ImageMagick pode manipular sem precisar especificar *.png , *.jpg , *.jpeg etc:

#!/bin/bash

images=$(identify -format '%f\n' * 2>/dev/null)

IFS=$'\n'
set -e

max_dims=$(
  identify -format '%w %h\n' $images 2>/dev/null |
  awk '($1>w){w=$1} ($2>h){h=$2} END{print w"x"h}'
  )

orig_dir=originals_$(date +%Y-%m-%d_%T)
mkdir "$orig_dir"
mv -- $images "$orig_dir"
cd "$orig_dir"

set +e

for image in $images; do
  convert -- "$image" -gravity Center -extent "$max_dims" "../$image"
done

Isso moverá as imagens originais para um diretório datado, caso os resultados não sejam desejáveis. Além disso, isso falhará se, por qualquer motivo, os arquivos de imagem tiverem novas linhas em seus nomes.

Este script poderia fazer com mais algumas mensagens de erro para dar uma indicação útil se algo desse errado. Mas, por enquanto, se houver algum erro ao mover as imagens (tudo entre o set -e e set +e ), o script será encerrado. Espero que isso evite causar danos irreversíveis.

Atualizar

Agora, com o script awk plagiado da resposta @ terdon .

    
por 01.04.2014 / 19:59
6

Contanto que você selecione um tamanho de destino maior do que a sua maior imagem, não há problemas com o seguinte:

mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png

O comando acima alterará o arquivo original , você pode querer fazer backup antes de executá-lo. Ele usa mogrify do ImageMagick para redimensionar todos os pngs no diretório atual para 200x200px ( -extent 200x200 ) adicionando um plano de fundo branco ( -background black ) e centralizando a imagem ( -gravity Center ). O -colorspace RGB é necessário para evitar erros como

mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present 'emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754.

Para não perder nenhum dado de imagem, verifique se o tamanho que você usa é maior ou maior que a maior imagem que você tem. Para conseguir isso rapidamente, tente:

file *png | awk -F, '{print $2}' | sort -nu

Isso deve imprimir os tamanhos de todas as imagens classificadas e você pode encontrar facilmente as maiores.

Para apaziguar Goldilocks (: P), você pode automatizar todo o processo:

dimensions=$(file *png | cut -d, -f 2 | sort -u | 
            awk '($1>w){w=$1}($3>h){h=$3}END{print w"x"h}') && 
mogrify -gravity Center -extent $dimensions -background white -colorspace RGB *png; 
    
por 01.04.2014 / 18:54
6

Aproveitei a oportunidade para melhorar minhas habilidades bash e descobri isso:

#!/bin/bash

maxx=0
maxy=0

# find largest dimension
for file in *.jpg ; do
  dim=$(identify "$file" | awk '{ print $3 }')
  xdim=$(echo $dim | cut -f1 -dx)
  ydim=$(echo $dim | cut -f2 -dx)
  if [ $xdim -gt $maxx ] ; then
    maxx=$xdim
  fi
  if [ $ydim -gt $maxy ] ; then
    maxy=$ydim
  fi
done

mkdir bordered

# resize and store new images in new folder
for file in *.jpg ; do
  dim=$(identify "$file" | awk '{ print $3 }')
  xdim=$(echo $dim | cut -f1 -dx)
  ydim=$(echo $dim | cut -f2 -dx)

  xborder=$(( ($maxx - $xdim ) / 2 ))
  yborder=$(( ($maxy - $ydim ) / 2 ))

  convert "$file" -bordercolor black -border ${xborder}x${yborder} "bordered/$file"

done

Isso deve fazer o truque: primeiro faz um loop em todos os arquivos (muda de acordo com as suas necessidades) para encontrar a maior largura e altura e depois volta novamente para adicionar as bordas necessárias (altere a parte -bordercolor black para atender às suas necessidades) . Os novos arquivos são armazenados na pasta "bordered".

    
por 01.04.2014 / 18:54