Eu tenho um monte de imagens digitalizadas em formato jpg. Como você pode ver nas fotos abaixo, os cartões são frente e verso, ao digitalizar coloquei 6 cartões dentro do scanner.
A frente do primeiro cartão é numerada 1 na imagem abaixo, e seu verso é numerado 7. A frente do segundo cartão é numerada 2 e seu verso é numerado 8, e etc.
O que eu quero realizar: Dividir esses arquivos (image1.jpg e image2.jpg) de forma que eu tenha uma pasta contendo os cartões individuais na seguinte ordem:
1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg)
3.jpg(2)
4.jpg(8)
etc
(image1.jpg) Frente dos seis cartões:
(image2.jpg) Verso dos seis cartões:
1- Como posso dividir imagens com base nessas linhas divisórias usando o imagemagick (ou qualquer outra solução)? (Posso obter xey dessas linhas porque todas as imagens têm 2550x3507)
as linhas divisórias estão em vermelho:
- após a divisão ou durante a divisão, é possível numerá-los automaticamente com base na ordem desejada descrita acima?
Responder1
Como posso dividir imagens com base nessas linhas divisórias usando [ImageMagick?]
Indiscutivelmente, a solução mais simples provavelmente seria usar-cortarigual a:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg
Este comando:
Divide cada imagem em 6 blocos de tamanhos (aproximadamente) iguais (-cortar 3x2@), numerando cada um em ordem.
Inicia a sequência numérica em
1
(-cena 1), em vez de0
.Fornece 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 um corte de ladrilho, isso também pode produzir imagens "cortadas" (provavelmente indesejáveis).Usar, por exemplo,
-3x2@
normalmente cria imagens com tamanho mais próximo (em relação umas às outras) do que porcentagens de "ultrapassagem" (por exemplo,33.4%x50%
) para evitar a produção de imagens "cortadas".Em um arquivo em lote, você precisará duplicar 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
), você pode querer incluir+repáginadepois do seu-crop
:convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
+repage
Se seus formatos de entrada puderem conter deslocamentos de imagem/tela, você também pode querer isso.
Renomeando
É possível numerá-los automaticamente com base na ordem descrita acima?
Somente com o ImageMagick, não consegui fazer isso (suspeito que provavelmente não seja possível, mas honestamente não tenho certeza sobre isso). Claro, separado do ImageMagick, isso é completamente possível.
Como você marcou esta pergunta com batch
, vale a pena mencionar que provavelmente não poderei ajudar com boas soluções em lote. Com isso em mente, parece muito provável que você (ou outra pessoa) consiga encontrar algo melhor do que o que detalho abaixo.
Resposta obrigatória em lote (não)
A renomeação por força bruta é possível com 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 Batch 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, esta solução pode (obviamente) ser melhorada.
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 "intermediário" (por exemplo, 2-6):
(Position_N * 2) - 1
- Itens além do ponto "intermediário" (por exemplo, 7-11):
(Position_N * 2) - Total_Items
Nota: Embora seja possível aplicar estas fórmulas a uma sequência inteira (por exemplo, 1 e 12), o primeiro e o último item nunca mudam de posição. Isso provavelmente torna desnecessário renomeá-los.
Além disso, estes devem funcionar para qualqueraténúmero (não ímpar) de itens/posições (4 ou superior), assumindo que os nomes dos seus arquivos estão 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 que você deve estar ciente se decidir usá-los como tal...
Ordenaçã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 irão "quebrar" as fórmulas fornecidas. Particularmente:
O Windows classifica os nomes emlexicográficoordem por padrão. Isso significa itens que não possuem um dígito
0
na frente de um único dígito (por exemploimagem_1.jpgvs.imagem_01.jpg) não aparecerá em ordem (natural) quando retornado 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
) em nomes de arquivos também podem afetar a ordem em que os nomes de arquivos são retornados.
Se você usar as fórmulas acima, certifique-se de 0
preencher dígitos únicos nos nomes dos arquivos e remover coisas como - Copy
(ou tomar medidas para mitigar esses problemas).
Loops/contadores começando com 0
Se você estiver usando uma linguagem que começa a contar 0
(por exemplo, em loops), isso pode alterar ligeiramente as fórmulas:
- Itens até o ponto "intermediário" (por exemplo, 1-5):
(Position_N * 2)
- Itens além do ponto "intermediário" (por exemplo, 6-10):
(Position_N * 2) - (Total_Items - 1)
Lembre-se que, contando a partir de 0, seriam executados 12 itens 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
.
Um script Python
Se você estiver interessado, escrevi um pequeno (provavelmente terrível)Script Pythonpara 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 exemplocropped_01.jpg...recortado_XX.jpg) na ordem especificada em sua pergunta. Você vai precisartenha uma cópia do Pythoninstalado se você decidir experimentá-lo.
Limitações
Não lê arquivos de texto em busca de informações (portanto, não é necessário especificar uma lista de arquivos neste momento). Da mesma forma, um prefixo e uma extensão de nome de imagem/arquivo são necessários na linha de comando.
Da forma como está, o script espera que os nomes dos arquivos sejam retornados automaticamente na ordem correta (consulte Windows e
0
-padding, acima).Existe uma opção de usar um módulo de terceiros chamado
natsort
(instalado, por exemplopython -m pip install natsort
, ) se seus itens não forem0
preenchidos. No entanto, você precisa descomentar a linha 13 (from natsort import natsorted
) e a linha 105 (item_list = list(natsorted(item_list))
) no script após a instalaçãonatsort
para usar esta opção.
Para ser claro, "descomentar" significa remover o #
espaço inicial no início da linha. Instruções adicionais sobre uso estão incluídas no script.