Como posso dividir imagens com base nessas linhas divisórias usando o [ImageMagick?]
Indiscutivelmente, a solução mais simples provavelmente seria usar -crop assim:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg
Este comando:
Divide cada imagem em 6 (aproximadamente) blocos de tamanho igual ( -corte 3x2 @ ), numerando cada um em ordem.
Inicia a sequência de numeração em 1
( -cena 1 ), em vez de 0
.
Dá aos números finais um 0
preenchimento ( %02d
) nos dígitos únicos [ 01-09
].
Notas de comando
Embora seja possível especificar um tamanho exato (por exemplo 1000x1000
) ou usar porcentagens (por exemplo 33%x50%
) para uma colheita de ladrilhos, isso também pode potencialmente produzir imagens "aparadas" (provavelmente indesejáveis).
O uso de, por exemplo, -3x2@
geralmente cria imagens com tamanho mais próximo (em relação ao outro) do que porcentagens de "superação" (por exemplo 33.4%x50%
), para evitar a produção de imagens "aparadas".
Em um arquivo em lotes, você precisará dobrar os sinais de porcentagem para que funcionem conforme o esperado:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
Se você estiver gravando em formatos que podem ter deslocamentos de imagem / tela (por exemplo .png
), convém incluir + repage após -crop
:
convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
Se os seus formatos de entrada puderem conter compensações de imagem / tela, convém +repage
também.
Renomeando
É possível numerá-los automaticamente com base na ordem descrita acima?
Com o ImageMagick sozinho, não consegui fazê-lo (suspeito que provavelmente não seja possível, mas sinceramente não tenho certeza disso). Obviamente, separado do ImageMagick, isso é completamente possível.
Desde que você marcou essa pergunta batch
, vale a pena mencionar que provavelmente não posso ajudar com boas soluções em lote. Com isso em mente, parece muito provável que você (ou outra pessoa) possa criar algo melhor do que o que detalho abaixo.
Resposta em lote obrigatória (não)
É possível renomear com força bruta no lote. Primeiro, renomeie todos os arquivos (exceto o primeiro e o último) temporariamente, por exemplo:
rename cropped_02.jpg cropped_02_temp.jpg
[...]
rename cropped_11.jpg cropped_11_temp.jpg
Em seguida, renomeie-os de volta para suas novas posições, por exemplo:
rename cropped_02_temp.jpg cropped_03.jpg
rename cropped_03_temp.jpg cropped_05.jpg
rename cropped_04_temp.jpg cropped_07.jpg
rename cropped_05_temp.jpg cropped_09.jpg
rename cropped_06_temp.jpg cropped_11.jpg
rename cropped_07_temp.jpg cropped_02.jpg
rename cropped_08_temp.jpg cropped_04.jpg
rename cropped_09_temp.jpg cropped_06.jpg
rename cropped_10_temp.jpg cropped_08.jpg
rename cropped_11_temp.jpg cropped_10.jpg
O lote tem a capacidade de pegar argumentos da linha de comando e fazer contas, além de possuir for
loops e if
instruções, etc., portanto, essa solução pode (obviamente) ser aprimorada.
Renomeando Notas
Se você observar a segunda metade do processo de renomeação acima, notará um padrão nos nomes dos arquivos. Efetivamente, para uma determinada posição N, podemos usar uma das duas fórmulas a seguir para encontrar a nova posição de um item no seu esquema:
- Itens até o ponto "meio caminho" (por exemplo, 2-6):
(Position_N * 2) - 1
- Itens além do ponto "intermediário" (por exemplo, 7 a 11):
(Position_N * 2) - Total_Items
Nota: Embora seja possível aplicar essas fórmulas a uma sequência inteira (por exemplo, 1 e 12), o primeiro e o último item nunca mudam de posição. Isso sem dúvida torna desnecessário renomeá-los.
Além disso, eles devem funcionar para qualquer número par (não ímpar) de itens / posições (4 ou mais), assumindo que os nomes dos arquivos estejam em ordem (por exemplo, 1 a 12). Então, para seus exemplos originais:
Temp Item 2 becomes (2 * 2) - 1 = Item 3
Temp Item 7 becomes (7 * 2) - 12 = Item 2
Temp Item 8 becomes (8 * 2) - 12 = Item 4
[...]
Assim, as fórmulas fornecidas podem potencialmente ser a base para soluções em lote (ou outros scripts). No entanto, há algumas outras coisas a serem observadas se você decidir usá-las como tal ...
Classificação
A classificação (conforme mencionado acima) pode ter consequências práticas em coisas como scripts, pois os itens retornados "fora de ordem" pelo Windows "quebrarão" as fórmulas fornecidas. Particularmente:
O Windows classifica os nomes em ordem lexicográfica por padrão. Isso significa que os itens que não possuem um 0
dígito na frente de um dígito (por exemplo, imagem_1.jpg vs. imagem_01.jpg ) não aparecerão em ordem (natural) quando retornados diretamente pelo Windows. Ou seja, eles serão retornados como por exemplo:
cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
Certas palavras e frases (como - Copy
) nos nomes dos arquivos também podem afetar a ordem na qual os nomes dos arquivos são retornados.
Se você usar as fórmulas acima, certifique-se de 0
digitar apenas um dígito nos nomes dos arquivos e remova coisas como - Copy
(ou tome medidas para mitigar esses problemas).
Loops / contadores começando com 0
Se você estiver usando um idioma que começa a contar 0
(por exemplo, em loops), isso pode alterar ligeiramente as fórmulas:
- Itens até o ponto "meio caminho" (por exemplo, 1-5):
(Position_N * 2)
- Itens além do ponto "intermediário" (por exemplo, 6 a 10):
(Position_N * 2) - (Total_Items - 1)
Lembre-se de que, contando de 0 a 12 itens, seria executado 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
.
Um script Python
Se você estiver interessado, escrevi um pequeno script Python (provavelmente terrível) para o Python 3.x (testado com 3.6.4), que pode ser usado na linha de comando para renomear arquivos arbitrários que estão em sequência (por exemplo, cropped_01. jpg ... cropped_XX.jpg ) na ordem especificada na sua pergunta. Você precisará ter uma cópia do Python instalada se decidir experimentá-la.
Limitações
Não lê arquivos de texto para obter informações (portanto, não é necessário especificar uma lista de arquivos no momento). Da mesma forma, um prefixo e uma extensão de nome de imagem / arquivo são necessários na linha de comando.
Como está, o script espera que os nomes dos arquivos sejam retornados na ordem correta automaticamente (consulte Windows e 0
padding, acima).
Existe uma opção para usar um módulo de terceiros chamado natsort
(instalado com, por exemplo python -m pip install natsort
) se seus itens não estiverem 0
preenchidos. No entanto, é necessário descomentar a linha 13 ( from natsort import natsorted
) e a linha 105 ( item_list = list(natsorted(item_list))
) no script após a instalação natsort
para usar esta opção.
Para ser claro, "descomentar" significa remover o #
espaço inicial e o início da linha. Instruções adicionais sobre o uso estão incluídas no script.