1. Tạo hình ảnh với kênh alpha
Định dạng RGBA (Red, Green, Blue, Alpha) là mở rộng của định dạng RGB thông thường, bao gồm kênh alpha để điều chỉnh độ trong suốt. Hình ảnh ở định dạng này cho phép áp dụng các hiệu ứng độ trong suốt.
Tải hình ảnh với kênh alpha
Khi tải các hình ảnh PNG hỗ trợ độ trong suốt, Pillow sẽ tự động nhận diện kênh alpha.
from PIL import Image
# Mở hình ảnh có kênh alpha
image = Image.open("transparent_image.png")
print(image.mode) # Phải xuất 'RGBA' cho hình ảnh có kênh alpha
Nếu hình ảnh đã có kênh alpha, nó sẽ được mở ở định dạng RGBA
. Nếu không, có thể chuyển đổi nó bằng cách sử dụng convert()
.
Chuyển đổi hình ảnh sang định dạng RGBA
Nếu hình ảnh không có kênh alpha, bạn có thể thêm vào bằng cách chuyển đổi hình ảnh sang chế độ RGBA.
# Chuyển đổi hình ảnh sang định dạng RGBA
image = image.convert("RGBA")
2. Tạo nền trong suốt
Đôi khi cần tạo một hình ảnh với nền hoàn toàn trong suốt, nơi bạn có thể vẽ hoặc thêm các phần tử khác. Để làm điều này, hãy tạo một hình ảnh mới ở chế độ RGBA và lấp đầy hoàn toàn bằng màu trong suốt.
# Tạo hình ảnh với nền trong suốt
transparent_image = Image.new("RGBA", (500, 500), (255, 255, 255, 0))
transparent_image.save("transparent_background.png")
Trong ví dụ này, hình ảnh kích thước 500x500 pixel với nền trong suốt được tạo ra. Màu (255, 255, 255, 0)
biểu thị màu trắng với giá trị alpha là 0 (hoàn toàn trong suốt).
3. Áp dụng độ trong suốt cho hình ảnh
Đôi khi cần thay đổi độ trong suốt của toàn bộ hình ảnh. Điều này có thể thực hiện được bằng phương pháp putalpha()
, cho phép điều chỉnh độ trong suốt từng pixel.
Cài đặt mức độ trong suốt cho hình ảnh
Phương pháp putalpha()
cho phép đặt mức độ trong suốt cho toàn bộ hình ảnh. Giá trị của kênh alpha có thể thay đổi từ 0 (hoàn toàn trong suốt) đến 255 (hoàn toàn không trong suốt).
# Cài đặt mức độ trong suốt cho toàn bộ hình ảnh
image.putalpha(128) # Đặt độ trong suốt một nửa
image.save("semi_transparent_image.png")
Mã này làm cho hình ảnh trở nên nửa trong suốt bằng cách đặt giá trị kênh alpha thành 128 (một nửa của 255).
4. Áp dụng mặt nạ độ trong suốt
Mặt nạ là hình ảnh đen trắng, nơi các vùng trắng (giá trị 255) hoàn toàn hiển thị, còn các vùng đen (giá trị 0) hoàn toàn trong suốt. Các giá trị từ 0 đến 255 tạo ra gradient độ trong suốt.
Áp dụng mặt nạ cho hình ảnh
# Tải hình ảnh và mặt nạ
image = Image.open("foreground.png").convert("RGBA")
mask = Image.open("mask.png").convert("L") # Mặt nạ ở dạng thang độ xám
# Áp dụng mặt nạ cho độ trong suốt
image.putalpha(mask)
image.save("masked_image.png")
Trong ví dụ này, mặt nạ mask.png
được áp dụng cho hình ảnh foreground.png
. Các vùng trắng của mặt nạ làm cho hình ảnh hoàn toàn hiển thị, trong khi các vùng đen thì trong suốt và các vùng xám thì nửa trong suốt.
5. Chồng hình ảnh với độ trong suốt
Pillow cho phép chồng một hình ảnh lên hình ảnh khác, tính đến kênh alpha. Điều này hữu ích để tạo các hiệu ứng chồng ghép và kết hợp hình ảnh.
Chồng một hình ảnh lên trên hình ảnh khác
Giả sử bạn có một hình ảnh nền và một hình ảnh với các vùng trong suốt mà bạn muốn chồng lên nền.
# Tải hình ảnh nền và hình ảnh để chồng
background = Image.open("background.jpg").convert("RGBA")
overlay = Image.open("overlay.png").convert("RGBA")
# Chồng overlay lên background ở tọa độ (50, 50)
background.paste(overlay, (50, 50), overlay)
# Lưu kết quả
background.save("overlay_result.png")
Ở đây, overlay
là hình ảnh với độ trong suốt được chồng lên background
ở tọa độ (50, 50)
. Sử dụng tham số thứ ba (hình ảnh làm mặt nạ) khi gọi paste()
cho phép tính đến các vùng trong suốt khi chồng.
6. Điều chỉnh từng điểm của kênh alpha
Để điều chỉnh chi tiết độ trong suốt của từng pixel, bạn có thể sử dụng các phương pháp putpixel()
và getpixel()
, cho phép thay đổi độ trong suốt ở cấp độ từng pixel.
Ví dụ: Thay đổi độ trong suốt của từng pixel
# Mở hình ảnh ở chế độ RGBA
image = Image.open("example.png").convert("RGBA")
# Thay đổi độ trong suốt của pixel ở phần trên của hình ảnh
width, height = image.size
for x in range(width):
for y in range(int(height / 2)): # Nửa trên
r, g, b, a = image.getpixel((x, y))
image.putpixel((x, y), (r, g, b, int(a * 0.5))) # Pixel nửa trong suốt
image.save("pixel_transparency_example.png")
Mã này làm cho nửa trên của hình ảnh trở nên nửa trong suốt. Chúng ta sử dụng getpixel()
để lấy giá trị màu sắc của từng pixel, sau đó thay đổi kênh alpha và ghi lại pixel đã cập nhật bằng cách sử dụng putpixel()
.
7. Ví dụ
Ví dụ đầy đủ về làm việc với kênh alpha và độ trong suốt
Kết hợp tất cả các phương pháp lại và tạo một hình ảnh với nền trong suốt, trên đó chèn văn bản và các phần tử đồ họa nửa trong suốt.
from PIL import Image, ImageDraw, ImageFont
# Tạo hình ảnh với nền trong suốt
image = Image.new("RGBA", (500, 500), (255, 255, 255, 0))
draw = ImageDraw.Draw(image)
# Vẽ một hình chữ nhật nửa trong suốt
draw.rectangle((50, 50, 450, 150), fill=(255, 0, 0, 128)) # Đỏ với độ trong suốt 50%
# Vẽ một hình tròn nửa trong suốt
draw.ellipse((50, 200, 450, 400), fill=(0, 0, 255, 128)) # Xanh dương với độ trong suốt 50%
# Thêm văn bản có độ trong suốt
font = ImageFont.truetype("arial.ttf", 36)
draw.text((100, 50), "Hello, World!", font=font, fill=(255, 255, 255, 128))
# Lưu kết quả
image.save("alpha_channel_example.png")
Ví dụ này tạo một hình ảnh với nền trong suốt, một hình chữ nhật đỏ nửa trong suốt, một hình tròn xanh và văn bản có độ trong suốt. Phương pháp này hữu ích để tạo ra các hình ảnh được thiết kế chuyên nghiệp với các phần tử chồng lên nền.
Ứng dụng thực tế của độ trong suốt và kênh alpha
- Tạo logo và watermark: Kênh alpha cho phép tạo logo và watermark nửa trong suốt, vừa không làm rối mắt nhưng vẫn đủ nổi bật.
- Thiết kế giao diện: Các phần tử trong suốt thường được sử dụng cho các lớp phủ và nút trong giao diện.
- Collage và ghép hình: Làm việc với độ trong suốt giúp tạo các bố cục phức tạp, nơi hình ảnh có thể phủ lên nhau một cách mềm mại.
GO TO FULL VERSION