dividir imágenes jpg según proporciones dadas (imagemagick)

dividir imágenes jpg según proporciones dadas (imagemagick)

Tengo un montón de imágenes escaneadas en formato jpg. Como veis en las imágenes de abajo, las tarjetas son de dos caras, al escanear he colocado 6 tarjetas dentro del escáner.

El anverso de la primera tarjeta está numerado 1 en la imagen de abajo, y su reverso está numerado 7. El anverso de la segunda tarjeta está numerado 2 y su reverso está numerado 8, y etc.

Lo que quiero lograr: dividir estos archivos (imagen1.jpg e imagen2.jpg) de manera que tenga una carpeta que contenga las tarjetas individuales en un orden como este:

1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg) 

3.jpg(2)
4.jpg(8)
etc

(imagen1.jpg) Anverso de las seis cartas: Anverso de las cartas

(imagen2.jpg) Reverso de las seis cartas: Reverso de las cartas

1- ¿Cómo puedo dividir imágenes según estas líneas divisorias usando imagemagick (o cualquier otra solución)? (Puedo obtener la x y la y de estas líneas porque todas las imágenes son 2550x3507)

Las líneas divisorias están en rojo: Las líneas divisorias están en rojo.

  1. después de dividir o durante la división, ¿es posible numerarlos automáticamente según el orden deseado descrito anteriormente?

Respuesta1

¿Cómo puedo dividir imágenes según estas líneas divisorias usando [ImageMagick?]

Podría decirse que la solución más sencilla sería utilizar-cultivoal igual que:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg

Este comando:

  • Divide cada imagen en 6 mosaicos (aproximadamente) del mismo tamaño (-recortar 3x2@), numerando cada uno en orden.

  • Inicia la secuencia de numeración en 1(-escena 1), en vez de 0.

  • Da a los números finales un 0relleno ( %02d) en los dígitos individuales [ 01-09].

Notas de comando

  • Si bien es posible especificar un tamaño exacto (p. ej. 1000x1000) o utilizar porcentajes (p. ej. 33%x50%) para un recorte de mosaico, esto también puede producir imágenes "recortadas" (probablemente no deseable).

  • El uso de, por ejemplo, -3x2@normalmente crea imágenes que tienen un tamaño más cercano (entre sí) que los porcentajes de "exceso" (por ejemplo, 33.4%x50%) para evitar producir imágenes "recortadas".

  • En un archivo por lotes, deberá duplicar los signos de porcentaje para que funcionen según lo previsto:

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
    
  • Si está escribiendo en formatos que pueden tener desplazamientos de imagen/lienzo (p. ej. .png), es posible que desee incluir+repaginadespues de ti -crop:

    convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
    
  • Si sus formatos de entrada pueden contener desplazamientos de imagen/lienzo, es posible que +repagetambién los desee.


Cambiar el nombre

¿Es posible numerarlos automáticamente según el orden descrito anteriormente?

Solo con ImageMagick, no pude hacerlo (sospecho que probablemente no sea posible, pero honestamente no estoy seguro de esto). Por supuesto, aparte de ImageMagick, esto es completamente posible.

Dado que ha etiquetado esta pregunta con batch, vale la pena mencionar que probablemente no pueda ayudar con ninguna buena solución por lotes. Con eso en mente, parece muy probable que usted (u otra persona) pueda encontrar algo mejor que lo que detallo a continuación.

Lote obligatorio (no)Respuesta

Es posible cambiar el nombre por fuerza bruta con lotes. Primero, cambie el nombre de cada archivo (excepto el primero y el último) temporalmente, por ejemplo:

rename cropped_02.jpg  cropped_02_temp.jpg 
[...]
rename cropped_11.jpg  cropped_11_temp.jpg 

Luego, cámbieles el nombre a sus nuevas posiciones, por ejemplo:

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 

Batch tiene la capacidad de tomar argumentos de la línea de comandos y hacer cálculos, además de poseer forbucles y ifdeclaraciones, etc., por lo que esta solución se puede (obviamente) mejorar.


Cambiar el nombre de las notas

Si observa la segunda mitad del proceso de cambio de nombre anterior, notará un patrón en los nombres de los archivos. Efectivamente, para una Posición N determinada, podemos usar una de las dos fórmulas siguientes para encontrar la nueva posición de un elemento en su esquema:

  • Elementos hasta el punto "medio" (por ejemplo, 2-6): (Position_N * 2) - 1
  • Elementos más allá del punto "medio" (por ejemplo, 7-11): (Position_N * 2) - Total_Items

Nota: Si bien es posible aplicar estas fórmulas a una secuencia completa (por ejemplo, 1 y 12), el primer y el último elemento nunca cambian de posición. Podría decirse que esto hace innecesario cambiarles el nombre.


Además, estos deberían funcionar para cualquierincluso(no impar) número de elementos/posiciones (4 o más), suponiendo que los nombres de sus archivos estén en orden (por ejemplo, 1 a 12). Entonces, para sus ejemplos originales:

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
[...]

Por lo tanto, las fórmulas proporcionadas pueden ser potencialmente la base para soluciones por lotes (u otras secuencias de comandos). Sin embargo, hay un par de cosas más que debes tener en cuenta si decides utilizarlos como tales...

Clasificación

La clasificación (como se mencionó anteriormente) puede tener consecuencias prácticas en cosas como scripts, ya que los elementos que Windows devuelve "desordenados" "romperán" las fórmulas dadas. Particularmente:

  • Windows ordena los nombres enlexicográficoorden por defecto. Esto significa elementos que no tienen un dígito 0delante de un solo dígito (p. ej.imagen_1.jpgvs.imagen_01.jpg) no aparecerá en orden (natural) cuando Windows lo devuelva directamente. Es decir, se devolverán como, por ejemplo:

    cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
    
  • Ciertas palabras y frases (como - Copy) en los nombres de los archivos también pueden afectar el orden en que se devuelven los nombres de los archivos.

Si utiliza las fórmulas anteriores, asegúrese de 0rellenar con dígitos un solo dígito en los nombres de sus archivos y eliminar elementos como - Copy(o tomar medidas para mitigar estos problemas).

Bucles/Contadores que comienzan con 0

Si está utilizando un lenguaje que comienza a contar 0(por ejemplo, en bucles), esto puede cambiar ligeramente las fórmulas:

  • Elementos hasta el punto "medio" (por ejemplo, 1-5): (Position_N * 2)
  • Elementos más allá del punto "medio" (por ejemplo, 6-10): (Position_N * 2) - (Total_Items - 1)

Recuerde que, contando desde 0, se ejecutarían 12 elementos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Una secuencia de comandos de Python

Si estás interesado, he escrito un pequeño (probablemente terrible)secuencia de comandos de Pythonpara Python 3.x (probado con 3.6.4), que se puede usar desde la línea de comando para cambiar el nombre de archivos arbitrarios que están en secuencia (p. ej.cropped_01.jpg...cropped_XX.jpg) al orden especificado en su pregunta. Necesitarastener una copia de Pythoninstalado si decides probarlo.

Limitaciones

  • No lee archivos de texto para obtener información (por lo que no se especifica una lista de archivos en este momento). Del mismo modo, se requiere un prefijo y una extensión de nombre de imagen/archivo en la línea de comando.

  • Tal como está, el script espera que los nombres de los archivos se devuelvan automáticamente en el orden correcto (consulte Windows y 0-padding, más arriba).

  • Existe una opción para utilizar un módulo de terceros llamado natsort(instalado con, por ejemplo python -m pip install natsort), si sus elementos no están 0acolchados. Sin embargo, debe descomentar la línea 13 ( from natsort import natsorted) y la línea 105 ( item_list = list(natsorted(item_list))) en el script después de la instalación natsortpara usar esta opción.

Para ser claros, "descomentar" significa eliminar el #espacio inicial y al principio de la línea. Se incluyen instrucciones adicionales sobre el uso con el script.

información relacionada