Hợp nhất hình ảnh trong Python

Chỉnh sửa hình ảnh được sử dụng rất nhiều để nâng cao chất lượng của hình ảnh. Với sự xuất hiện của máy ảnh di động và các ứng dụng chỉnh sửa hình ảnh, mọi người dùng di động đều biết cách chỉnh sửa hình ảnh. Trong số các tính năng chỉnh sửa hình ảnh khác, tạo ảnh ghép là một tính năng phổ biến trong đó nhiều hình ảnh được kết hợp thành một hình ảnh duy nhất. Vì vậy, trong bài viết này, chúng tôi sẽ trình bày cách hợp nhất nhiều hình ảnh trong Python. Điều này có thể hữu ích cho bạn nếu bạn đang xử lý việc chỉnh sửa hình ảnh trong ứng dụng Python của mình.

Thư viện Python để hợp nhất hình ảnh

Để hợp nhất nhiều hình ảnh thành một hình ảnh duy nhất, chúng tôi sẽ sử dụng Aspose.Imaging for Python. Nó là một thư viện xử lý hình ảnh giàu tính năng để thực hiện một số thao tác chỉnh sửa hình ảnh một cách dễ dàng. Bạn có thể tải xuống thư viện hoặc cài đặt nó bằng lệnh sau.

> pip install aspose-imaging-python-net 

Hợp nhất nhiều hình ảnh trong Python

Có hai cách để hợp nhất hình ảnh: theo chiều dọc và chiều ngang. Bạn có thể chọn phương pháp phù hợp. Chúng ta hãy xem cách kết hợp hình ảnh theo cả hai cách trong các phần sau.

Hợp nhất hình ảnh theo chiều ngang trong Python

Dưới đây là các bước để hợp nhất các hình ảnh theo chiều ngang bằng Aspose.Imaging for Python.

  • Bắt đầu bằng cách chỉ định đường dẫn của các hình ảnh trong một mảng.
  • Sau đó, tính chiều cao và chiều rộng của hình ảnh kết quả.
  • Tạo một đối tượng của lớp JpegOptions và đặt các tùy chọn cần thiết.
  • Tạo một đối tượng của lớp JpegImage và khởi tạo nó với đối tượng JpegOptions cũng như chiều cao và chiều rộng của hình ảnh kết quả.
  • Lặp qua danh sách các hình ảnh và tải từng hình ảnh bằng lớp RasterImage.
  • Tạo một Hình chữ nhật cho mỗi hình ảnh và thêm nó vào hình ảnh kết quả bằng cách sử dụng phương thức JpegImage.saveargb32pixels().
  • Tăng chiều rộng đường may trong mỗi lần lặp lại.
  • Cuối cùng, lưu hình ảnh thu được bằng phương thức JpegImage.save(string).

Dưới đây là mã để hợp nhất các hình ảnh theo chiều ngang trong 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

# Xác định các thư mục
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")

# Nhận kích thước hình ảnh kết quả
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Tính toán kích thước mới
new_width = 0
new_height = 0
for size in image_sizes:
	new_width += size.width
	new_height = max(new_height, size.height)
	
# Kết hợp hình ảnh thành hình ảnh mới
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)

# Xóa các tập tin tạm thời
if delete_output:
	os.remove(output_path)
	if os.path.exists(temp_file_path):
		os.remove(temp_file_path)

Dưới đây là hình ảnh đầu ra mà chúng tôi có được sau khi hợp nhất các hình ảnh theo chiều ngang.

Hợp nhất hình ảnh theo chiều ngang trong Python

Kết hợp hình ảnh theo chiều dọc trong Python

Bây giờ hãy xem cách hợp nhất nhiều hình ảnh theo chiều dọc. Các bước ghép ảnh theo chiều dọc sẽ giống như trong phần trước. Sự khác biệt duy nhất là chúng ta sẽ hoán đổi vai trò của thuộc tính chiều cao và chiều rộng.

Mẫu mã sau đây cho biết cách hợp nhất các hình ảnh theo bố cục dọc trong 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

# Xác định thư mục
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")

# Nhận kích thước hình ảnh kết quả
image_sizes = []
for image_path in image_paths:
	with Image.load(image_path) as image:
		image_sizes.append(image.size)

# Tính toán kích thước mới
new_width = 0
new_height = 0
for size in image_sizes:
	new_height += size.height
	new_width = max(new_width, size.width)
	
# Kết hợp hình ảnh thành hình ảnh mới
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)

# Xóa các tập tin tạm thời
if delete_output:
	os.remove(output_path)

Hình ảnh sau đây cho thấy kết quả của việc hợp nhất hai hình ảnh tương tự theo chiều dọc.

Hợp nhất hình ảnh theo chiều dọc trong Python

Hợp nhất hình ảnh PNG trong Python

Các bước và mẫu mã được cung cấp trong các phần trước là để hợp nhất các hình ảnh JPG, tuy nhiên, bạn cũng có thể cần phải hợp nhất các hình ảnh PNG. Không cần phải lo lắng. Các bước và mẫu mã tương tự cũng hợp lệ đối với hình ảnh PNG và thay đổi duy nhất sẽ là sử dụng các lớp PngImage và PngOptions thay vì JpegImage và JpegOptions tương ứng.

Nhận thư viện hợp nhất hình ảnh Python miễn phí

Bạn có thể nhận giấy phép tạm thời miễn phí và hợp nhất các hình ảnh mà không bị giới hạn đánh giá.

Hợp nhất hình ảnh trực tuyến

Bạn cũng có thể sử dụng công cụ hợp nhất hình ảnh miễn phí của chúng tôi để hợp nhất các hình ảnh của bạn trực tuyến. Công cụ này dựa trên Aspose.Imaging for Python và bạn không phải tạo tài khoản cho nó.

Phần kết luận

Bài viết này cung cấp cho bạn một trong những giải pháp tốt nhất và đơn giản nhất để hợp nhất nhiều hình ảnh thành một hình ảnh duy nhất trong Python. Việc hợp nhất hình ảnh ngang và dọc được thể hiện với sự trợ giúp của các mẫu mã. Ngoài ra, chúng tôi đã giới thiệu cho bạn một công cụ trực tuyến để ghép ảnh miễn phí.

Bạn có thể khám phá thêm về thư viện xử lý ảnh Python bằng cách truy cập tài liệu. Ngoài ra, bạn có thể chia sẻ thắc mắc của mình với chúng tôi qua diễn đàn của chúng tôi.

Xem thêm