Combinar imágenes en Python

La edición de imágenes se utiliza inmensamente para mejorar la calidad de las imágenes. Con la aparición de las cámaras móviles y las aplicaciones de edición de imágenes, todos los usuarios de dispositivos móviles saben cómo editar una imagen. Entre otras funciones de edición de imágenes, la creación de collages es muy popular en la que se combinan varias imágenes en una sola imagen. Entonces, en este artículo, demostraremos cómo fusionar varias imágenes en Python. Esto podría serle útil si está tratando con la edición de imágenes en su aplicación de Python.

Biblioteca de Python para fusionar imágenes

Para fusionar varias imágenes en una sola imagen, usaremos Aspose.Imaging for Python. Es una biblioteca de procesamiento de imágenes rica en funciones para realizar varias operaciones de edición de imágenes sin esfuerzo. Puede descargar la biblioteca o instalarla con el siguiente comando.

> pip install aspose-imaging-python-net 

Combinar varias imágenes en Python

Hay dos formas de fusionar imágenes: vertical y horizontalmente. Puede elegir el método adecuado. Veamos cómo combinar imágenes en ambos sentidos en las siguientes secciones.

Combinar imágenes horizontalmente en Python

A continuación se muestran los pasos para fusionar las imágenes horizontalmente usando Aspose.Imaging for Python.

  • Comience especificando las rutas de las imágenes en una matriz.
  • Luego, calcule la altura y el ancho de la imagen resultante.
  • Cree un objeto de la clase JpegOptions y configure las opciones requeridas.
  • Cree un objeto de la clase JpegImage e inicialícelo con el objeto JpegOptions y la altura y el ancho de la imagen resultante.
  • Recorra la lista de imágenes y cargue cada imagen usando la clase RasterImage.
  • Cree un Rectángulo para cada imagen y agréguelo a la imagen resultante usando el método JpegImage.saveargb32pixels().
  • Aumente el ancho cosido en cada iteración.
  • Finalmente, guarde la imagen resultante usando el método JpegImage.save(string).

A continuación se muestra el código para fusionar imágenes horizontalmente en Python.

import aspose.pycore as aspycore
from aspose.imaging import Image, Rectangle, RasterImage
from aspose.imaging.imageoptions import JpegOptions
from aspose.imaging.sources import FileCreateSource
from aspose.imaging.fileformats.jpeg import JpegImage
import os

# Definir las carpetas
if 'TEMPLATE_DIR' in os.environ:
	templates_folder = os.environ['TEMPLATE_DIR']
else:
	templates_folder = r"C:\Users\USER\Downloads\templates"

delete_output = 'SAVE_OUTPUT' not in os.environ
data_dir = templates_folder
image_paths = [os.path.join(data_dir, "template.jpg"), 
			   os.path.join(data_dir, "template.jpeg")]
output_path = os.path.join(data_dir, "result.jpg")
temp_file_path = os.path.join(data_dir, "temp.jpg")

# Obtener el tamaño de la imagen resultante
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Calcular nuevo tamaño
new_width = 0
new_height = 0
for size in image_sizes:
	new_width += size.width
	new_height = max(new_height, size.height)
	
# Combinar imágenes en una nueva
temp_file_source = FileCreateSource(temp_file_path, delete_output)
with JpegOptions() as options:
	options.source = temp_file_source
	options.quality = 100
	with aspycore.as_of(Image.create(options, new_width, new_height), JpegImage) as new_image:
		stitched_width = 0
		for image_path in image_paths:
			with aspycore.as_of(Image.load(image_path), RasterImage) as image:
				bounds = Rectangle(stitched_width, 0, image.width, image.height)
				new_image.save_argb_32_pixels(bounds, image.load_argb_32_pixels(image.bounds))
				stitched_width += image.width
		new_image.save(output_path)

# Eliminar archivos temporales
if delete_output:
	os.remove(output_path)
	if os.path.exists(temp_file_path):
		os.remove(temp_file_path)

A continuación se muestra la imagen de salida que obtuvimos después de fusionar imágenes horizontalmente.

Combinar imágenes horizontalmente en Python

Combinar imágenes verticalmente en Python

Veamos ahora cómo fusionar varias imágenes verticalmente. Los pasos para fusionar imágenes verticalmente serían los mismos que en el apartado anterior. La única diferencia es que intercambiaríamos los roles de las propiedades de alto y ancho.

El siguiente ejemplo de código muestra cómo fusionar imágenes en un diseño vertical en Python.

import aspose.pycore as aspycore
from aspose.imaging import Image, Rectangle, RasterImage
from aspose.imaging.imageoptions import JpegOptions
from aspose.imaging.sources import StreamSource
from aspose.imaging.fileformats.jpeg import JpegImage
from aspose.imaging.extensions import StreamExtensions
import os
import functools

# Definir carpetas
if 'TEMPLATE_DIR' in os.environ:
	templates_folder = os.environ['TEMPLATE_DIR']
else:
	templates_folder = r"C:\Users\USER\Downloads\templates"

delete_output = 'SAVE_OUTPUT' not in os.environ
data_dir = templates_folder
image_paths = [os.path.join(data_dir, "template.jpg"), os.path.join(data_dir, "template.jpeg")]
output_path = os.path.join(data_dir, "result.jpg")
temp_file_path = os.path.join(data_dir, "temp.jpg")

# Obtener el tamaño de la imagen resultante
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Calcular nuevo tamaño
new_width = 0
new_height = 0
for size in image_sizes:
	new_height += size.height
	new_width = max(new_width, size.width)
	
# Combinar imágenes en una nueva
with StreamExtensions.create_memory_stream() as memory_stream:
	output_stream_source = StreamSource(memory_stream)
	with JpegOptions() as options:
		options.source = output_stream_source
		options.quality = 100
		with aspycore.as_of(Image.create(options, new_width, new_height), JpegImage) as new_image:
			stitched_height = 0
			for image_path in image_paths:
				with aspycore.as_of(Image.load(image_path), RasterImage) as image:
					bounds = Rectangle(0, stitched_height, image.width, image.height)
					new_image.save_argb_32_pixels(bounds, image.load_argb_32_pixels(image.bounds))
					stitched_height += image.height

			new_image.save(output_path)

# Eliminar archivos temporales
if delete_output:
	os.remove(output_path)

La siguiente imagen muestra el resultado de fusionar dos imágenes similares verticalmente.

Combinar imágenes verticalmente en Python

Combinar imágenes PNG en Python

Los pasos y ejemplos de código proporcionados en las secciones anteriores fueron para fusionar imágenes JPG; sin embargo, es posible que también deba fusionar imágenes PNG. No hay necesidad de preocuparse. Los mismos pasos y ejemplo de código son válidos para las imágenes PNG y el único cambio sería usar las clases PngImage y PngOptions en lugar de JpegImage y JpegOptions, respectivamente.

Obtenga la biblioteca de combinación de imágenes de Python gratis

Puede obtener una licencia temporal gratuita y fusionar las imágenes sin limitaciones de evaluación.

Combinar imágenes en línea

También puede usar nuestra herramienta de combinación de imágenes gratuita para combinar sus imágenes en línea. Esta herramienta se basa en Aspose.Imaging for Python y no es necesario que cree una cuenta.

Conclusión

Este artículo le proporcionó una de las mejores y más sencillas soluciones para fusionar varias imágenes en una sola imagen en Python. La fusión de imágenes horizontales y verticales se demuestra con la ayuda de ejemplos de código. Además, le presentamos una herramienta en línea para fusionar imágenes sin costo alguno.

Puede explorar más sobre la biblioteca de procesamiento de imágenes de Python visitando la documentación. Además, puede compartir sus consultas con nosotros a través de nuestro foro.

Ver también