Объединение изображений в Python

Редактирование изображений широко используется для повышения качества изображений. С появлением мобильных камер и приложений для редактирования изображений каждый мобильный пользователь знает, как редактировать изображение. Среди других функций редактирования изображений популярным является создание коллажей, в которых несколько изображений объединяются в одно изображение. Итак, в этой статье мы покажем, как объединить несколько изображений в Python. Это может быть полезно для вас, если вы имеете дело с редактированием изображений в своем приложении Python.

Библиотека Python для слияния изображений

Чтобы объединить несколько изображений в одно, мы будем использовать Aspose.Imaging for Python. Это многофункциональная библиотека обработки изображений, позволяющая легко выполнять несколько операций редактирования изображений. Вы можете либо скачать библиотеку, либо установить ее с помощью следующей команды.

> pip install aspose-imaging-python-net 

Объединение нескольких изображений в Python

Существует два способа объединения изображений: по вертикали и по горизонтали. Вы можете выбрать подходящий метод. Давайте посмотрим, как комбинировать изображения обоими способами в следующих разделах.

Объединить изображения по горизонтали в Python

Ниже приведены шаги по объединению изображений по горизонтали с помощью Aspose.Imaging for Python.

  • Начните с указания путей изображений в массиве.
  • Затем вычислите высоту и ширину результирующего изображения.
  • Создайте объект класса JpegOptions и установите необходимые параметры.
  • Создайте объект класса JpegImage и инициализируйте его с помощью объекта JpegOptions, а также высоты и ширины результирующего изображения.
  • Прокрутите список изображений и загрузите каждое изображение, используя класс RasterImage.
  • Создайте прямоугольник для каждого изображения и добавьте его к результирующему изображению, используя метод JpegImage.saveargb32pixels().
  • Увеличивайте ширину сшивания на каждой итерации.
  • Наконец, сохраните полученное изображение с помощью метода JpegImage.save(string).

Ниже приведен код для горизонтального объединения изображений в 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

# Определите папки
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")

# Получить результирующий размер изображения
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Рассчитать новый размер
new_width = 0
new_height = 0
for size in image_sizes:
	new_width += size.width
	new_height = max(new_height, size.height)
	
# Объединить изображения в новое
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)

# Удалить временные файлы
if delete_output:
	os.remove(output_path)
	if os.path.exists(temp_file_path):
		os.remove(temp_file_path)

Ниже приведено выходное изображение, которое мы получили после объединения изображений по горизонтали.

Объединить изображения по горизонтали в Python

Объединение изображений по вертикали в Python

Давайте теперь посмотрим, как объединить несколько изображений по вертикали. Шаги объединения изображений по вертикали будут такими же, как и в предыдущем разделе. Единственная разница в том, что мы поменяем роли свойств высоты и ширины.

В следующем примере кода показано, как объединить изображения в вертикальном макете в 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

# Определить папки
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")

# Получить результирующий размер изображения
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Рассчитать новый размер
new_width = 0
new_height = 0
for size in image_sizes:
	new_height += size.height
	new_width = max(new_width, size.width)
	
# Объединить изображения в новое
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)

# Удалить временные файлы
if delete_output:
	os.remove(output_path)

На следующем изображении показан результат объединения двух похожих изображений по вертикали.

Объединение изображений по вертикали в Python

Объединение изображений PNG в Python

Шаги и примеры кода, приведенные в предыдущих разделах, предназначались для объединения изображений JPG, однако вам может понадобиться также объединить изображения PNG. Не нужно беспокоиться. Те же шаги и пример кода действительны для изображений PNG, и единственным изменением будет использование классов PngImage и PngOptions вместо JpegImage и JpegOptions соответственно.

Получите бесплатную библиотеку слияния изображений Python

Вы можете получить бесплатную временную лицензию и объединить изображения без ограничений на оценку.

Объединить изображения онлайн

Вы также можете использовать наш бесплатный инструмент для слияния изображений, чтобы объединить свои изображения в Интернете. Этот инструмент основан на Aspose.Imaging for Python, и вам не нужно создавать для него учетную запись.

Заключение

В этой статье вы найдете одно из лучших и самых простых решений для объединения нескольких изображений в одно изображение в Python. Слияние изображений по горизонтали и вертикали демонстрируется с помощью примеров кода. Кроме того, мы познакомили вас с онлайн-инструментом для бесплатного объединения изображений.

Вы можете узнать больше о библиотеке обработки изображений Python, посетив документацию. Кроме того, вы можете поделиться с нами своими вопросами через наш форум.

Смотрите также