Fusionner des images en Python

L’édition d’images est extrêmement utilisée pour améliorer la qualité des images. Avec l’émergence des caméras mobiles et des applications d’édition d’images, chaque utilisateur mobile sait comment éditer une image. Parmi les autres fonctionnalités d’édition d’images, la création de collages est une activité populaire dans laquelle plusieurs images sont combinées en une seule image. Ainsi, dans cet article, nous allons montrer comment fusionner plusieurs images en Python. Cela pourrait vous être utile si vous avez affaire à l’édition d’images dans votre application Python.

Bibliothèque Python pour fusionner des images

Pour fusionner plusieurs images en une seule image, nous utiliserons Aspose.Imaging for Python. Il s’agit d’une bibliothèque de traitement d’images riche en fonctionnalités permettant d’effectuer plusieurs opérations d’édition d’images sans effort. Vous pouvez soit télécharger la bibliothèque, soit l’installer à l’aide de la commande suivante.

> pip install aspose-imaging-python-net 

Fusionner plusieurs images en Python

Il existe deux façons de fusionner des images : verticalement et horizontalement. Vous pouvez choisir la méthode appropriée. Voyons comment combiner des images dans les deux sens dans les sections suivantes.

Fusionner des images horizontalement en Python

Vous trouverez ci-dessous les étapes pour fusionner les images horizontalement à l’aide d’Aspose.Imaging for Python.

  • Commencez par spécifier les chemins des images dans un tableau.
  • Ensuite, calculez la hauteur et la largeur de l’image résultante.
  • Créez un objet de la classe JpegOptions et définissez les options requises.
  • Créez un objet de la classe JpegImage et initialisez-le avec l’objet JpegOptions et la hauteur et la largeur de l’image résultante.
  • Parcourez la liste des images et chargez chaque image à l’aide de la classe RasterImage.
  • Créez un rectangle pour chaque image et ajoutez-le à l’image résultante à l’aide de la méthode JpegImage.saveargb32pixels().
  • Augmentez la largeur cousue à chaque itération.
  • Enfin, enregistrez l’image résultante à l’aide de la méthode JpegImage.save(string).

Vous trouverez ci-dessous le code permettant de fusionner horizontalement des images 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

# Définir les dossiers
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")

# Obtenir la taille de l'image résultante
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Calculer la nouvelle taille
new_width = 0
new_height = 0
for size in image_sizes:
	new_width += size.width
	new_height = max(new_height, size.height)
	
# Combinez les images en une nouvelle
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)

# Supprimer les fichiers temporaires
if delete_output:
	os.remove(output_path)
	if os.path.exists(temp_file_path):
		os.remove(temp_file_path)

Ci-dessous, l’image de sortie que nous avons obtenue après avoir fusionné les images horizontalement.

Fusionner des images horizontalement en Python

Combiner des images verticalement en Python

Voyons maintenant comment fusionner plusieurs images verticalement. Les étapes de fusion verticale des images seraient les mêmes que dans la section précédente. La seule différence est que nous échangerions les rôles des propriétés de hauteur et de largeur.

L’exemple de code suivant montre comment fusionner des images dans une disposition verticale 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

# Définir des dossiers
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")

# Obtenir la taille de l'image résultante
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Calculer la nouvelle taille
new_width = 0
new_height = 0
for size in image_sizes:
	new_height += size.height
	new_width = max(new_width, size.width)
	
# Combinez les images en une nouvelle
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)

# Supprimer les fichiers temporaires
if delete_output:
	os.remove(output_path)

L’image suivante montre le résultat de la fusion verticale de deux images similaires.

Fusionner des images verticalement en Python

Fusionner des images PNG en Python

Les étapes et les exemples de code fournis dans les sections précédentes concernaient la fusion d’images JPG, mais vous devrez peut-être également fusionner des images PNG. Pas besoin de s’inquiéter. Les mêmes étapes et exemples de code sont valables pour les images PNG et le seul changement serait d’utiliser les classes PngImage et PngOptions au lieu de JpegImage et JpegOptions, respectivement.

Obtenez gratuitement la bibliothèque de fusion d’images Python

Vous pouvez obtenir une licence temporaire gratuite et fusionner les images sans limitation d’évaluation.

Fusionner des images en ligne

Vous pouvez également utiliser notre outil de fusion d’images gratuit pour fusionner vos images en ligne. Cet outil est basé sur Aspose.Imaging for Python et vous n’avez pas besoin de créer un compte pour celui-ci.

Conclusion

Cet article vous a fourni l’une des solutions les meilleures et les plus simples pour fusionner plusieurs images en une seule image en Python. La fusion horizontale et verticale des images est démontrée à l’aide d’exemples de code. De plus, nous vous avons présenté un outil en ligne pour fusionner des images gratuitement.

Vous pouvez en savoir plus sur la bibliothèque de traitement d’image Python en visitant la documentation. Vous pouvez également partager vos questions avec nous via notre forum.

Voir également