converta com bash - trim / crop e center

1

Eu preciso de uma maneira rápida e confiável para modificar muitas imagens. Há um monte de branco em torno das minhas fotos que eu quero me livrar. O problema é que são várias imagens semelhantes, mas elas têm tamanhos diferentes. Um exemplo é aqui: um link Minhas imagens têm apenas a parte vermelha e azul e um enorme espaço branco ao redor deles. Quero fotos com o mesmo formato e menos espaço em branco.

Primeiro, preciso da dimensão máxima da parte não branca de todas as imagens e, em seguida, recorte todas as imagens para o formato da maior dimensão. Mas o centro da imagem tem que ficar no centro.

Isso é de alguma forma possível com a conversão ou qualquer outra ferramenta de linha de comando?

    
por ano302 27.02.2015 / 09:44

2 respostas

0

Ok, depois de uma outra hora no google eu criei minha própria solução. Em este link existe um script que passa por todas as imagens e as corta enquanto o centro fica no centro. Agora eu tenho minhas fotos recortadas. Com

ww='convert -ping "$f" -format "%w" info:

E percorrendo todos os valores de ww para todas as fotos eu recebo wmax.

wmax='convert xc: -format "%[fx:max($ww,$wmax)]" info:'

Com isso e vários loops

 convert $f -gravity center -background white -extent ${wmax}x${hmax} ${f}-canvas.png

Eu obtenho os resultados. Não é legal, eu colha mais uma vez do que o necessário, mas faz o trabalho e eu tenho que terminar minha tese.

    #!/bin/sh
    # gives the largest x and y values of all  png files in directory and puts them in the center of a canvas. This canvas is 10px*10px larger than the largest png file.

    # We cycle over all pngs to get maximum w and h
    for f in *.png
    do
      echo "Processing $f file..."
      # take action on each file. $f has current file name
    wmax=0
    hmax=0
    # width
    ww='convert -ping "$f" -format "%w" info:'
    #echo $ww
    # height
    hh='convert -ping "$f" -format "%h" info:'
    #echo $hh
    wmax='convert xc: -format "%[fx:max($ww,$wmax)]" info:'

    hmax='convert xc: -format "%[fx:max($hh,$hmax)]" info:'

    #  centertrim $f
    #  rm $f
    #  mv $f.out $f
    done

    echo $wmax
    echo $hmax
    wmaxp10=$(($wmax + 10 ))
    echo $wmaxp10
    hmaxp10=$(($hmax + 10 ))
    echo $hmaxh10
    # now we cycle through all pictures and add them to a canvas with $wmax+10 $hmax+10
    for f in *.png
    do
      echo "Processing $f file..."
      # take action on each file. $f has current file name
    echo convert $f -gravity center -background white -extent ${wmaxp10}x${hmaxp10} ${f}-canvas.png
    convert $f -gravity center -background white -extent ${wmaxp10}x${hmaxp10} ${f}-canvas.png
    #  centertrim $f
    #  rm $f
    #  mv $f.out $f
    done
    
por ano302 27.02.2015 / 11:27
0

Experimente o seguinte script:

#!/bin/bash

max_width=0
max_height=0
border=10

# Trim all files to remove the white borders
for i in *.png; do
    convert $i -trim "${i%.*}"__trimmed.png
done

# Find the max width and height
for i in *__trimmed.png; do
    w="$(identify -format "%w" $i)"
    h="$(identify -format "%h" $i)"
    if (( $w > $max_width )); then max_width=$w; fi;
    if (( $h > $max_height )); then max_height=$h; fi; 
done

# Add a small border (optional)
max_width=$(($max_width+$border))
max_height=$(($max_height+$border))

# Add borders to all pictures so that they all have the same size
# "-gravity center" will center them
# -background None will avoid the default white background as your sample image
# was a png with a transparent backgroud
for i in *__trimmed.png; do
    convert $i -background None -gravity center -extent "${max_width}x${max_height}" "${i%__trimmed.*}".png
done

rm -f *__trimmed.png
    
por Sylvain Pineau 27.02.2015 / 11:37