1. Giới thiệu
Tổng quan về Python và Pillow
Python là một ngôn ngữ lập trình được nhiều lập trình viên và nhà khoa học dữ liệu ưa chuộng. Với cú pháp đơn giản và thư viện phong phú, Python được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau. Trong số đó, Pillow (trước đây là PIL: Python Imaging Library) là một thư viện xử lý hình ảnh phổ biến dành cho Python.
Pillow hỗ trợ nhiều định dạng hình ảnh như JPEG, PNG, GIF, và cho phép thực hiện các thao tác như thay đổi kích thước, cắt xén, áp dụng bộ lọc, thêm văn bản và nhiều chức năng khác. Thư viện này thường được sử dụng trong các ứng dụng và dự án liên quan đến đọc, lưu và chỉnh sửa hình ảnh.
Mục tiêu của bài viết này
Bài viết này sẽ hướng dẫn chi tiết cách xử lý hình ảnh với thư viện Pillow trong Python, từ các thao tác cơ bản đến nâng cao. Cụ thể, chúng ta sẽ tìm hiểu về cách mở và lưu hình ảnh, thay đổi kích thước, xoay ảnh, áp dụng bộ lọc, vẽ văn bản lên ảnh và thậm chí là ghép ảnh.
Sau khi đọc bài viết này, bạn sẽ nắm vững cách sử dụng Pillow và có thể áp dụng vào các dự án thực tế của mình.
2. Cách cài đặt Pillow
2.1 Cài đặt Pillow trong môi trường Python
Trước khi sử dụng Pillow, bạn cần cài đặt thư viện này trong môi trường Python của mình. Việc cài đặt rất đơn giản, bạn chỉ cần nhập lệnh sau vào terminal (hoặc Command Prompt trên Windows):
pip install Pillow
Công cụ pip
sẽ tự động tải xuống và cài đặt Pillow cho bạn. Sau khi cài đặt thành công, bạn có thể bắt đầu xử lý hình ảnh ngay lập tức.
2.2 Kiểm tra xem Pillow đã hoạt động chưa
Sau khi cài đặt Pillow, bạn có thể chạy đoạn mã đơn giản sau để kiểm tra xem thư viện đã hoạt động chính xác chưa:
from PIL import Image
# Kiểm tra hoạt động của Pillow
img = Image.new('RGB', (100, 100), color = 'red')
img.save('test_image.png')
Đoạn mã trên sẽ tạo một hình ảnh màu đỏ có kích thước 100×100 pixel và lưu lại với tên test_image.png
. Nếu tệp hình ảnh này được tạo thành công, điều đó có nghĩa là Pillow đã được cài đặt và hoạt động chính xác.
2.3 Các vấn đề thường gặp khi cài đặt và cách khắc phục
Đôi khi, bạn có thể gặp lỗi khi cài đặt Pillow. Dưới đây là một số vấn đề phổ biến và cách giải quyết:
- Phiên bản Python quá cũ
Pillow chỉ hỗ trợ Python từ phiên bản 3.x trở lên. Nếu bạn đang sử dụng phiên bản cũ hơn, quá trình cài đặt có thể bị lỗi. Hãy kiểm tra phiên bản Python của bạn bằng lệnhpython --version
và cập nhật nếu cần. - Thiếu thư viện phụ thuộc
Một số hệ thống có thể thiếu các thư viện cần thiết để Pillow hoạt động. Nếu gặp lỗi, bạn có thể thử cài đặt lại với tùy chọn nâng cấp tất cả các gói liên quan bằng lệnh sau:
pip install Pillow --upgrade
- Thiếu cấu hình biến môi trường
Trên Windows, nếu Pillow không hoạt động đúng cách, có thể Python hoặc Pip chưa được thiết lập đúng trong biến môi trường. Hãy kiểm tra lại và thêm đường dẫn Python vào biến môi trường nếu cần.

3. Đọc và hiển thị hình ảnh
3.1 Cách đọc tệp hình ảnh bằng Python
Việc đọc hình ảnh là bước cơ bản trong xử lý ảnh với Pillow. Để mở một tệp hình ảnh, bạn có thể sử dụng phương thức Image.open()
.
Dưới đây là đoạn mã mẫu để mở một tệp hình ảnh:
from PIL import Image
# Đọc tệp hình ảnh
img = Image.open('sample.jpg')
# Hiển thị thông tin về hình ảnh
print(img.format) # Định dạng tệp (ví dụ: JPEG, PNG)
print(img.size) # Kích thước (chiều rộng, chiều cao)
print(img.mode) # Chế độ màu (ví dụ: RGB, L)
Trong đoạn mã trên, phương thức Image.open()
giúp mở tệp hình ảnh, sau đó các thuộc tính như format
, size
và mode
được sử dụng để lấy thông tin về hình ảnh.
3.2 Hiển thị hình ảnh
Sau khi đọc tệp hình ảnh, bạn có thể hiển thị nó bằng phương thức show()
. Phương thức này sẽ mở hình ảnh bằng trình xem ảnh mặc định trên hệ điều hành.
from PIL import Image
# Đọc tệp hình ảnh
img = Image.open('sample.jpg')
# Hiển thị hình ảnh
img.show()
Sau khi chạy đoạn mã trên, hình ảnh sẽ được mở trong trình xem ảnh mặc định của hệ điều hành.
3.3 Lấy thông tin chi tiết về hình ảnh
Pillow cũng cho phép bạn lấy thông tin chi tiết về hình ảnh, bao gồm kích thước, định dạng tệp và chế độ màu.
from PIL import Image
# Đọc tệp hình ảnh
img = Image.open('sample.jpg')
# Hiển thị thông tin chi tiết về hình ảnh
print(f'Kích thước hình ảnh: {img.size}') # (Chiều rộng, Chiều cao)
print(f'Định dạng tệp: {img.format}') # Định dạng hình ảnh (JPEG, PNG, v.v.)
print(f'Chế độ màu: {img.mode}') # Chế độ màu (RGB, L, v.v.)
Đoạn mã này giúp bạn thu thập thông tin về hình ảnh để sử dụng trong các bước xử lý tiếp theo.
4. Xử lý hình ảnh cơ bản
4.1 Thay đổi kích thước hình ảnh
Một trong những thao tác cơ bản trong xử lý hình ảnh là thay đổi kích thước. Điều này rất hữu ích khi bạn cần điều chỉnh độ phân giải của hình ảnh cho trang web hoặc ứng dụng. Với Pillow, bạn có thể sử dụng phương thức resize()
để thay đổi kích thước một cách dễ dàng.
Dưới đây là đoạn mã để thay đổi kích thước hình ảnh:
from PIL import Image
# Mở hình ảnh
img = Image.open('sample.jpg')
# Thay đổi kích thước (Chiều rộng 400px, chiều cao 300px)
resized_img = img.resize((400, 300))
# Lưu hình ảnh đã thay đổi kích thước
resized_img.save('resized_sample.jpg')
Đoạn mã trên sẽ thay đổi kích thước hình ảnh về (400, 300)
pixel và lưu lại với tên tệp mới. Việc này giúp bạn dễ dàng điều chỉnh hình ảnh theo nhu cầu.
4.2 Cắt ảnh (Crop)
Cắt ảnh (crop) là thao tác lấy một phần hình ảnh thay vì toàn bộ ảnh. Điều này rất hữu ích khi bạn muốn lấy một vùng cụ thể trong ảnh gốc.
Dưới đây là đoạn mã để cắt ảnh:
from PIL import Image
# Mở hình ảnh
img = Image.open('sample.jpg')
# Cắt ảnh (tọa độ góc trên trái (100, 100) đến góc dưới phải (300, 300))
cropped_img = img.crop((100, 100, 300, 300))
# Lưu hình ảnh đã cắt
cropped_img.save('cropped_sample.jpg')
Đoạn mã trên sử dụng phương thức crop()
để lấy một phần hình ảnh từ tọa độ (100,100) đến (300,300) và lưu lại với tên tệp mới.
4.3 Xoay hình ảnh
Pillow cho phép bạn xoay hình ảnh bằng phương thức rotate()
. Khi xoay hình ảnh, có thể một phần của hình ảnh bị cắt, vì vậy bạn có thể sử dụng tùy chọn expand=True
để mở rộng kích thước hình ảnh sao cho không bị mất nội dung.
Dưới đây là đoạn mã để xoay hình ảnh 45 độ:
from PIL import Image
# Mở hình ảnh
img = Image.open('sample.jpg')
# Xoay 45 độ (Mở rộng kích thước để tránh mất nội dung)
rotated_img = img.rotate(45, expand=True)
# Lưu hình ảnh đã xoay
rotated_img.save('rotated_sample.jpg')
Đoạn mã trên giúp xoay hình ảnh 45 độ và đảm bảo rằng hình ảnh không bị mất phần nào bằng cách sử dụng expand=True
.
4.4 Lật hình ảnh
Bạn cũng có thể lật hình ảnh theo chiều ngang hoặc chiều dọc bằng cách sử dụng phương thức transpose()
.
Dưới đây là đoạn mã để lật hình ảnh theo chiều ngang:
from PIL import Image
# Mở hình ảnh
img = Image.open('sample.jpg')
# Lật hình ảnh theo chiều ngang
flipped_img = img.transpose(Image.FLIP_LEFT_RIGHT)
# Lưu hình ảnh đã lật
flipped_img.save('flipped_sample.jpg')
Tương tự, bạn có thể lật hình ảnh theo chiều dọc bằng cách thay Image.FLIP_LEFT_RIGHT
thành Image.FLIP_TOP_BOTTOM
.
5. Chuyển đổi định dạng và lưu hình ảnh
5.1 Chuyển đổi định dạng hình ảnh
Pillow cho phép bạn chuyển đổi hình ảnh từ định dạng này sang định dạng khác một cách dễ dàng. Ví dụ, bạn có thể chuyển đổi ảnh JPEG sang PNG chỉ bằng một dòng lệnh.
Dưới đây là đoạn mã để chuyển đổi định dạng hình ảnh:
from PIL import Image
# Mở hình ảnh JPEG
img = Image.open('sample.jpg')
# Lưu hình ảnh ở định dạng PNG
img.save('converted_image.png', 'PNG')
Đoạn mã trên sẽ mở một tệp JPEG và lưu nó dưới định dạng PNG.
5.2 Lưu hình ảnh với các tùy chọn
Khi lưu hình ảnh, bạn có thể điều chỉnh chất lượng hình ảnh để tối ưu hóa dung lượng tệp. Ví dụ, khi lưu ảnh ở định dạng JPEG, bạn có thể đặt mức chất lượng và bật chế độ tối ưu hóa.
Dưới đây là đoạn mã để lưu hình ảnh với chất lượng cao:
from PIL import Image
# Mở hình ảnh
img = Image.open('sample.jpg')
# Lưu hình ảnh ở định dạng JPEG với chất lượng 95
img.save('optimized_image.jpg', 'JPEG', quality=95, optimize=True)
Chất lượng ảnh có thể đặt từ 0 đến 100. Số cao hơn có nghĩa là chất lượng tốt hơn nhưng kích thước tệp lớn hơn.
6. Áp dụng bộ lọc và hiệu ứng lên hình ảnh
6.1 Điều chỉnh độ sáng và độ tương phản
Pillow cung cấp mô-đun ImageEnhance
giúp bạn điều chỉnh độ sáng và độ tương phản của hình ảnh một cách linh hoạt.
Dưới đây là cách tăng độ sáng của hình ảnh:
from PIL import Image, ImageEnhance
# Mở hình ảnh
img = Image.open('sample.jpg')
# Điều chỉnh độ sáng (Tăng độ sáng lên 1.5 lần)
enhancer = ImageEnhance.Brightness(img)
bright_img = enhancer.enhance(1.5)
# Lưu hình ảnh đã điều chỉnh
bright_img.save('bright_sample.jpg')
Tương tự, bạn có thể điều chỉnh độ tương phản của hình ảnh như sau:
from PIL import Image, ImageEnhance
# Mở hình ảnh
img = Image.open('sample.jpg')
# Điều chỉnh độ tương phản (Tăng gấp 2 lần)
enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(2.0)
# Lưu hình ảnh đã điều chỉnh
contrast_img.save('contrast_sample.jpg')
6.2 Áp dụng hiệu ứng làm mờ và làm sắc nét
Pillow hỗ trợ nhiều bộ lọc hiệu ứng như làm mờ hoặc làm sắc nét hình ảnh. Bạn có thể sử dụng mô-đun ImageFilter
để thực hiện việc này.
Dưới đây là cách làm mờ hình ảnh:
from PIL import Image, ImageFilter
# Mở hình ảnh
img = Image.open('sample.jpg')
# Áp dụng bộ lọc làm mờ
blurred_img = img.filter(ImageFilter.BLUR)
# Lưu hình ảnh sau khi làm mờ
blurred_img.save('blurred_sample.jpg')
Tương tự, bạn có thể làm sắc nét hình ảnh bằng cách thay thế ImageFilter.BLUR
thành ImageFilter.SHARPEN
.
6.3 Áp dụng bộ lọc đặc biệt
Pillow cung cấp nhiều bộ lọc khác nhau như phát hiện cạnh (edge detection), giúp bạn tạo ra hiệu ứng đặc biệt cho hình ảnh.
from PIL import Image, ImageFilter
# Mở hình ảnh
img = Image.open('sample.jpg')
# Áp dụng bộ lọc phát hiện cạnh
edge_img = img.filter(ImageFilter.FIND_EDGES)
# Lưu hình ảnh sau khi áp dụng bộ lọc
edge_img.save('edge_sample.jpg')
7. Vẽ văn bản và hình dạng lên hình ảnh
7.1 Cách vẽ văn bản bằng Pillow
Một trong những tính năng quan trọng của Pillow là khả năng vẽ văn bản lên hình ảnh. Điều này rất hữu ích khi tạo hình ảnh quảng cáo, hình thu nhỏ (thumbnail) hoặc thêm chú thích vào ảnh. Bạn có thể sử dụng mô-đun ImageDraw
để vẽ văn bản.
Dưới đây là cách thêm văn bản vào hình ảnh:
from PIL import Image, ImageDraw, ImageFont
# Mở hình ảnh
img = Image.open('sample.jpg')
# Tạo đối tượng vẽ
draw = ImageDraw.Draw(img)
# Vẽ văn bản lên hình ảnh
draw.text((10, 10), 'Hello, Pillow!', fill=(255, 255, 255))
# Lưu hình ảnh đã chỉnh sửa
img.save('text_sample.jpg')
Trong đoạn mã trên, ImageDraw.Draw()
được sử dụng để tạo đối tượng vẽ, sau đó draw.text()
vẽ văn bản “Hello, Pillow!” lên ảnh với màu trắng.
7.2 Chỉ định phông chữ
Mặc định, Pillow sử dụng phông chữ hệ thống, nhưng bạn có thể chỉ định phông chữ tùy chỉnh bằng mô-đun ImageFont
.
from PIL import Image, ImageDraw, ImageFont
# Mở hình ảnh
img = Image.open('sample.jpg')
# Tạo đối tượng vẽ
draw = ImageDraw.Draw(img)
# Chỉ định phông chữ và kích thước
font = ImageFont.truetype('arial.ttf', 40)
# Vẽ văn bản
draw.text((10, 10), 'Custom Font!', font=font, fill=(255, 255, 255))
# Lưu hình ảnh đã chỉnh sửa
img.save('font_sample.jpg')
Ở đây, chúng ta sử dụng ImageFont.truetype()
để chỉ định phông chữ “arial.ttf” với kích thước 40.
7.3 Vẽ hình dạng
Pillow cũng hỗ trợ vẽ các hình dạng như đường thẳng, hình chữ nhật, hình tròn, v.v. bằng phương thức line()
, rectangle()
, và ellipse()
.
from PIL import Image, ImageDraw
# Mở hình ảnh
img = Image.open('sample.jpg')
# Tạo đối tượng vẽ
draw = ImageDraw.Draw(img)
# Vẽ đường thẳng
draw.line((0, 0, 100, 100), fill=(255, 0, 0), width=5)
# Vẽ hình chữ nhật
draw.rectangle((50, 50, 150, 150), outline=(0, 255, 0), width=3)
# Vẽ hình tròn (ellipse)
draw.ellipse((200, 200, 300, 300), outline=(0, 0, 255), width=3)
# Lưu hình ảnh đã chỉnh sửa
img.save('shape_sample.jpg')
Đoạn mã trên vẽ một đường đỏ, một hình chữ nhật xanh lá cây và một hình tròn xanh dương lên hình ảnh.
8. Ứng dụng nâng cao: Xử lý ảnh ghép và mặt nạ
8.1 Ghép nhiều hình ảnh
Bạn có thể ghép nhiều hình ảnh bằng cách sử dụng phương thức paste()
trong Pillow.
from PIL import Image
# Mở ảnh nền và ảnh ghép
background = Image.open('background.jpg')
overlay = Image.open('overlay.png')
# Dán ảnh overlay lên ảnh nền tại vị trí (100, 100)
background.paste(overlay, (100, 100), overlay)
# Lưu ảnh sau khi ghép
background.save('combined_image.jpg')
Phương thức paste()
sẽ dán ảnh overlay.png
lên background.jpg
tại vị trí (100, 100).
8.2 Tạo ảnh cắt hình tròn bằng mặt nạ
Bạn có thể tạo ảnh có hình tròn bằng cách sử dụng mặt nạ (mask).
from PIL import Image, ImageDraw
# Mở hình ảnh
img = Image.open('sample.jpg')
# Tạo mặt nạ (mask) hình tròn
mask = Image.new('L', img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((100, 100, 300, 300), fill=255)
# Áp dụng mặt nạ
result = Image.new('RGB', img.size)
result.paste(img, (0, 0), mask)
# Lưu hình ảnh đã cắt
result.save('masked_image.jpg')
Bằng cách sử dụng mặt nạ, bạn có thể cắt ảnh thành hình tròn hoặc các hình dạng tùy chỉnh.
9. Tổng kết
Trong bài viết này, chúng ta đã tìm hiểu chi tiết cách sử dụng thư viện Pillow trong Python để xử lý hình ảnh. Chúng ta đã khám phá từ các thao tác cơ bản như đọc, lưu ảnh, thay đổi kích thước, xoay ảnh, đến các kỹ thuật nâng cao như ghép ảnh và tạo mặt nạ.
9.1 Tóm tắt các thao tác cơ bản
- Cài đặt Pillow và kiểm tra hoạt động
- Mở và hiển thị hình ảnh
- Thay đổi kích thước, cắt ảnh, xoay và lật ảnh
9.2 Ứng dụng nâng cao
- Áp dụng bộ lọc như làm mờ, làm sắc nét
- Vẽ văn bản và hình dạng lên ảnh
- Ghép nhiều hình ảnh và tạo mặt nạ
9.3 Hướng đi tiếp theo
Pillow là một công cụ mạnh mẽ trong xử lý hình ảnh, nhưng vẫn còn nhiều chức năng nâng cao khác mà bạn có thể khám phá. Bạn có thể sử dụng nó để xây dựng ứng dụng xử lý hình ảnh tự động, tạo dữ liệu cho machine learning hoặc áp dụng vào các dự án thực tế.
Bằng cách tiếp tục tìm hiểu tài liệu chính thức và thử nghiệm nhiều tính năng khác nhau, bạn có thể tối ưu hóa khả năng xử lý hình ảnh của mình với Pillow.