Combinación por lotes de imágenes grandes

Tengo un montón de imágenes de igual altura en formato PNG que quiero organizar horizontalmente en una sola imagen, sin superposición. Necesito un software que pueda hacer esto automáticamente (por ejemplo, con un archivo por lotes) o con solo unos pocos clics del mouse. Ni XnView ni IrfanView parecen tener esta opción en su repertorio de procesamiento por lotes. La herramienta de montaje/conversión de ImageMagick puede hacer esto, pero es extremadamente ineficiente en términos de memoria y utiliza más de 10 GB de RAM para combinar imágenes con solo 0,5 GP en total (a 24 bpp), lo cual es inaceptable. DipStych tiene un problema similar. Y por lo que he visto, el software de unión panorámica como ICE generalmente no puede combinar imágenes sin superponerlas.

En teoría, esta debería ser una tarea trivial: cargar todas las imágenes en la RAM, concatenar las matrices, guardarlas en el disco y listo. ¿Qué software puede realmente hacer esto?

Una implementación trivial que mencionó también asignaría más de 10 GB en el caso de 0.5 GP. Calcularía así: 512 * 1024 * 1024 * bytes_per_pixel * image_count. Esto alcanzaría los 10GB en caso de 7 imágenes. Supongo que imagemagick haría el trabajo con algunos ajustes. Por ejemplo: uso de memoria de ImageMagick
Su cálculo está mal; 0,5 * 3 = 1,5 GB. Usando la funcionalidad de caché de depuración, descubrí que ImageMagick asigna cuatro veces más RAM de la que realmente se necesita, y además de eso, hace algunas cosas extrañas cuando intenta convertir automáticamente PNG a indexados (y posiblemente algunas otras cosas) que requiere adicional memoria. Me las arreglé para desactivar la conversión del espacio de color, pero obviamente este software fue escrito por imbéciles, así que realmente estoy buscando una alternativa aquí, ya que necesito combinar imágenes con más de 12 GB en total, y solo tengo 32 GB. RAM.
¿Has probado la opción en IrfanView para "Crear imagen panorámica"? Eso simplemente une todas las imágenes, horizontal o verticalmente, sin superponerse.
Diría que es posible implementarlo entrelazando los datos de píxeles línea por línea. Incluso podría tomar menos memoria que una sola imagen. Sin embargo, esta sería una implementación muy específica solo para este propósito, por lo que dudo que exista de fábrica. Suena como una buena tarea para los estudiantes que quieren aprender sobre el uso de la memoria, la recolección de elementos no utilizados y el rendimiento.
¿Está de acuerdo con escribir su propio software, si no hay ningún software disponible?
Además, ¿cuál es tu presupuesto? ¿Gratis?

Respuestas (3)

Ya mencionaste imagemagick (IM). También debería funcionar con archivos más grandes. Solo inténtalo. Este software asigna por defecto una cantidad aparentemente razonable de memoria dependiendo de los recursos de hardware disponibles para facilitar el procesamiento rápido de las operaciones en la memoria principal y no depender de los tiempos de acceso al disco.

Lo primero que debe hacer es usar una versión de IM de 8 bits en lugar de una profundidad de color de 16 bits (o, alternativamente, graphicsmagick, que a menudo funciona incluso más rápido).

Si definitivamente desea poner IM (o gm) en cadenas y esperar más (órdenes de magnitud) para completar la tarea, puede probar su opción "-limit" ( https://www.imagemagick.org/script /command-line-options.php#limit ): tan pronto como se superen los límites propuestos relevantes, los píxeles de la imagen se asignan al disco en lugar de a la memoria principal.

Puede usar la cadena de herramientas de Hugin como si estuviera uniendo escaneos, como se describe en http://hugin.sourceforge.net/tutorials/scans/en.shtml , donde la sección Técnicas avanzadas habla sobre el uso de secuencias de comandos. Tendrá que investigar un poco en la documentación, pero puede forzar los puntos de control (utilizados para alinear imágenes) para que estén en los bordes comunes de las imágenes adyacentes.

Hugin es una cadena de herramientas gratuita, (gratis y de código abierto), multiplataforma, para realizar costuras panorámicas, apilamiento de enfoque y exposición, corrección y más.

Nota sobre el uso de la memoria:

Las imágenes JPEG son un formato comprimido, por lo que al considerar el uso de la memoria, cualquier operación (edición, conversión, unión, etc.) utilizará al menos píxeles de ancho x píxeles de alto x bytes_por_color x número de canales de color bytes de RAM. Por lo tanto, un archivo de ejemplo que elegí al azar es un jpeg con:

  • Tamaño: 6,334,976 bytes en disco (llámelo 6 MB)
  • Tamaño de imagen: 4896 ancho x 3672 alto = 17 978 112 píxeles
  • Modo RGB y bits/canal 8 = 3 bytes por píxel
  • Esto proporciona un requisito mínimo de RAM solo para los datos de imagen de 53 934 336 - (cerca de 54 MB) para la imagen de entrada única

Si está generando una nueva imagen, necesitará, como mínimo, suficiente espacio para la(s) imagen(es) de entrada más la imagen de salida final, por lo que fusionar 2 fotos como la de arriba necesitará al menos 4*54 MB = 216 MB para fusionar solo dos archivos de imagen de "6 MB".

respuesta tardía, muchos juegos toman un montón de pequeñas imágenes. y mézclelos todos en un programa. que luego escupe un solo archivo. con x,y (esquina superior/izquierda) y x,y (esquina inferior, derecha) dentro del archivo único de todas las imágenes dentro del archivo único. y luego solo hacen referencia a la matriz de la imagen que se mostrará. lo más probable es que se use para fines de animación simples de animación. de decir disparos (pequeña explosión) pero sin el arma. arma en sí, unidad de pie en cada dirección, etc... cada pequeña imagen generalmente tiene un fondo transparente, con solo los píxeles necesarios para mostrar. (diff) en esencia. por lo que el archivo único en general es un poco más pequeño. y los programadores de juegos pueden cargar un solo archivo en la memoria ocupando menos espacio. las pequeñas imágenes individuales pueden tener cualquier tamaño / forma en su mayor parte. es la lista de arreglos que saca con el único archivo grande. eso es importante.

trabajando con imágenes más grandes por otro lado. puede mirar el formato de archivo/imagen "tif", o mirar la lectura/escritura/añadir archivos puros al archivo. sin cargarlos todos en la memoria. leer archivo. escribir en archivo, leer archivo, agregar a archivo, leer archivo, agregar a archivo. por lo tanto, se usa una cantidad mínima de memoria.

html5 -> lienzo y algo de javascript podría funcionar. ejecute un botón de carga de archivos múltiples a través de la carga de archivos html5 con opción múltiple. y un javascript que sigue expandiéndose hacia la izquierda o hacia la derecha agregando imágenes una al lado de la otra en el elemento del lienzo, y luego guarda el lienzo mediante el botón de descarga. o aviso automático con una ventana de "descarga" al seleccionar dónde guardar.

OP quiere un programa para combinar muchas imágenes pequeñas en una grande. Básicamente, está sugiriendo un programa que deja las imágenes como están y simplemente las muestra con la alineación correcta. Esto no encaja.
culpa mía. releyendo parecería querer una sola imagen de "tira de película".