dividindo uma imagem em várias partes

1

Eu tenho uma imagem como abaixo. São 2579 * 2388 pixels. Vamos supor que o canto inferior esquerdo está em 0,0. A partir dessa imagem, quero criar várias imagens da seguinte forma e salvá-las na pasta de trabalho. Cada imagem terá tamanho de 100 * 100 pixels. Cada imagem será salva pelas coordenadas do lado inferior esquerdo.

  1. a primeira imagem terá seu canto inferior esquerdo em 0,0. Canto superior direito canto de mão será em 100.100 ea imagem será salva como 0-0.jpg
  2. a segunda imagem terá seu canto inferior esquerdo em 10,0. Topo canto direito será em 110.100 e a imagem será salva como 10-0.jpg
  3. Quando a linha inferior estiver concluída, a coordenada Y será movida por 10. Em caso da segunda linha, a primeira imagem será em 0,10 e essa imagem será salvo como 0-10.jpg

qual é o caminho mais rápido para fazer isso? Eu preferiria uma abordagem de linha de comando. Mas para começar, estou bem com qualquer tipo de ferramenta.

Eu entendo que, no caso da imagem atual, ela será dividida em cerca de 257 * 238 imagens. Mas eu tenho espaço em disco suficiente e preciso de cada imagem para realizar a detecção de texto.

    
por user2543622 24.04.2015 / 01:42

1 resposta

6

Aqui está o código do shell ( bash , ksh ou zsh ) que pode fazer o que você deseja:

image=clock.jpg

size=$( identify -ping -format "%wx%h" "${image}" )
x_upb=${size%x*}
y_upb=${size#*x}

x_inc=10
y_inc=10
x_tile=100
y_tile=100

for ((x=0; x<x_upb; x+=x_inc))
do
    for ((y=0; y<y_upb; y+=y_inc))
    do
        convert "${image}" -crop "${x_tile}x${y_tile}+${x}+${y}" "$x-$y.jpg"
    done
done

O programa convert é do pacote de programas do ImageMagick. Como também é possível extrair automaticamente o tamanho da imagem dos arquivos de imagem, também adicionei essa etapa. Seguindo o comentário de don_crissti, também estou propondo o uso de identify para esse propósito (também é conveniente, a partir do conjunto de programas ImageMagick). É claro que você também pode codificar o tamanho da imagem em x_upb e y_upb e também ajustar o tamanho do ladrilho e o incremento de mudança de ladrilho conforme necessário. Espero e acho que o código é auto-explicativo.

Nota: certamente precisa de alguns ajustes; por exemplo. as peças provavelmente não vão além dos limites superiores (ou você obterá sub-fotos menores se você estiver perto das bordas), então você precisaria subtrair o tamanho do ladrilho dos limites superiores se quisesse tamanhos iguais sub-imagens em toda a imagem.

Nota: Tanto quanto me lembro, a 'geometria' é definida para ter uma orientação começando com (0,0) no canto superior esquerdo. Se você quiser alguma outra orientação, precisará fazer as contas para se encaixar nessa definição de interface. Os padrões de código habituais para isso são endereçar as respectivas coordenadas dependendo do limite superior, por exemplo, $((y_upb - y)) , onde y seria a parte variante, a variável (loop-).

    
por 24.04.2015 / 02:08