dividir imagens jpg por determinadas proporções (imagemagick)

dividir imagens jpg por determinadas proporções (imagemagick)

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: Parte frontal dos cartões

(image2.jpg) Verso dos seis cartões: Verso dos 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: As linhas divisórias estão em vermelho

  1. 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 de 0.

  • 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
    
  • +repageSe 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 forloops e ifinstruçõ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 0na 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 0preencher 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 exemplo python -m pip install natsort, ) se seus itens não forem 0preenchidos. 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ção natsortpara 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.

informação relacionada