0
0
Lập trình
NM

Hướng Dẫn Vẽ Biểu Tượng và Văn Bản Quốc Tế Trên Hình Ảnh Bằng Python

Đăng vào 5 ngày trước

• 5 phút đọc

Hướng Dẫn Vẽ Biểu Tượng và Văn Bản Quốc Tế Trên Hình Ảnh Bằng Python

Nếu bạn đã từng tạo hình ảnh với văn bản trong Python, bạn có thể đã thấy điều này: □□□. Những ô trống này, được gọi là "tofu", xuất hiện khi font chữ bạn chọn không có ký tự tương ứng, một vấn đề phổ biến với biểu tượng cảm xúc (), ký hiệu () và các ngôn ngữ không phải Latin (世界).

Mặc dù các thư viện tiêu chuẩn thường yêu cầu các phương pháp phức tạp, bài hướng dẫn này sẽ chỉ cho bạn cách thư viện Python pictex tự động giải quyết vấn đề này.

Thiết Lập

Đầu tiên, hãy cài đặt pictex. Tất cả những gì bạn cần là pip:

Copy
pip install pictex

Bây giờ, hãy đi thẳng vào giải pháp.

Giải Pháp "Nó Chỉ Hoạt Động"

Hãy thử vẽ một chuỗi chứa văn bản tiếng Anh, tiếng Nhật và một biểu tượng cảm xúc bằng cách sử dụng một font chữ tiêu chuẩn như "Georgia", không hỗ trợ tất cả các ký tự này. Với pictex, bạn không cần bất kỳ cấu hình đặc biệt nào.

Copy
from pictex import Canvas

canvas = (
    Canvas()
    .font_family("Georgia") # Font serif đẹp nhưng có giới hạn
    .font_size(80)
    .color("darkslateblue")
    .padding(20)
    .background_color("whitesmoke")
)

text_with_mixed_chars = "Hello, 世界 ✨"
image = canvas.render(text_with_mixed_chars)
image.save("font_autofallback.png")

Kết quả là một hình ảnh được vẽ hoàn hảo, không có "tofu":

Cách Hoạt Động

Lưu ý rằng chúng ta không làm gì đặc biệt. pictex xử lý việc này ngay lập tức nhờ vào hệ thống thay thế font tự động của nó.

Cơ chế hoạt động như sau: Khi pictex chuẩn bị vẽ văn bản, nó kiểm tra xem font chữ chính (trong trường hợp này là "Georgia") có hỗ trợ mỗi ký tự hay không. Nếu nó tìm thấy một ký tự mà font chữ không có glyph, nó sẽ tự động tìm kiếm font đã cài đặt trên hệ thống của bạn có thể vẽ nó. Sau đó, nó sẽ sử dụng font thay thế đó cho các ký tự bị thiếu.

Kiểm Soát Hoàn Toàn Với .font_fallbacks()

Thay thế tự động là tuyệt vời, nhưng đôi khi bạn cần nhiều quyền kiểm soát hơn. Bạn có thể muốn đảm bảo một sự đồng nhất về phong cách cho một số ngôn ngữ nhất định hoặc sử dụng một font emoji tùy chỉnh mà bạn cung cấp.

Đây là lúc phương thức .font_fallbacks() xuất hiện. Nó cho phép bạn cung cấp một danh sách các file font của riêng bạn để thử trước khi pictex tìm kiếm toàn bộ hệ thống.

Chuỗi thay thế hoàn chỉnh được thực hiện theo thứ tự sau:

  1. Font Chính: Font được thiết lập với .font_family().
  2. Thay Thế Được Định Nghĩa Bởi Người Dùng: Danh sách các font được cung cấp cho .font_fallbacks(), theo thứ tự bạn liệt kê.
  3. Tìm Kiếm Hệ Thống Tự Động: Nếu không có font nào trong các bước trên có thể vẽ ký tự, pictex thực hiện cơ chế mặc định của nó để tìm kiếm bất kỳ font nào phù hợp trên hệ thống.

Hãy sử dụng điều này để chỉ định một font cụ thể cho văn bản tiếng Nhật. Chúng ta sẽ sử dụng font "Noto Sans JP" miễn phí từ Google Fonts.

Copy
from pictex import Canvas

# Một font chính phong cách (không hỗ trợ tiếng Nhật hoặc biểu tượng cảm xúc)
primary_font = "Lato-BoldItalic.ttf" 

# Một font cụ thể cho tiếng Nhật mà chúng ta muốn sử dụng làm thay thế
japanese_font = "NotoSansJP-Regular.ttf"

canvas = (
    Canvas()
    .font_family(primary_font)
    # Thông báo cho PicTex thử font tiếng Nhật của chúng ta trước khi tìm kiếm hệ thống
    .font_fallbacks(japanese_font)
    .font_size(80)
    .color("olive")
    .padding(20)
    .background_color("whitesmoke")
)

text_with_mixed_chars = "Hello, 世界 ✨"
image = canvas.render(text_with_mixed_chars)
image.save("font_custom_fallback.png")

Trong kết quả này, "Hello," được vẽ bằng font Lato, "世界" được vẽ bằng Noto Sans JP (lựa chọn cụ thể của chúng ta), và "✨" được vẽ bằng một font emoji được tìm thấy tự động trên hệ thống. Chúng ta đã đạt được việc vẽ hoàn hảo với sự kiểm soát nghệ thuật đầy đủ.

Thực Hành Tốt Nhất

  • Sử dụng font hỗ trợ nhiều ngôn ngữ: Để tránh vấn đề "tofu", hãy chọn những font có hỗ trợ tốt cho các ký tự quốc tế.
  • Kiểm tra trước khi sử dụng: Trước khi triển khai, hãy kiểm tra các font trên nhiều hệ điều hành khác nhau để đảm bảo khả năng tương thích.

Cạm Bẫy Thường Gặp

  • Không kiểm tra font: Một trong những cạm bẫy lớn nhất là không kiểm tra font trước khi sử dụng. Điều này có thể dẫn đến hình ảnh không hoàn hảo với ký tự không hiển thị.
  • Quá nhiều font: Sử dụng quá nhiều font thay thế có thể làm giảm hiệu suất và làm cho hình ảnh trở nên khó nhìn.

Mẹo Hiệu Suất

  • Giới hạn số lượng font: Giới hạn số lượng font mà bạn muốn sử dụng để đảm bảo hiệu suất tốt hơn trong quá trình vẽ.
  • Tối ưu hóa kích thước hình ảnh: Sau khi vẽ xong, hãy tối ưu hóa kích thước hình ảnh để cải thiện thời gian tải trang.

Giải Quyết Vấn Đề

  • Nếu bạn gặp phải tofu: Kiểm tra xem font chính có hỗ trợ ký tự mà bạn đang cố gắng hiển thị hay không. Nếu không, hãy thử sử dụng .font_fallbacks() để chỉ định các font thay thế.

Kết Luận

Xử lý văn bản đa ngôn ngữ và biểu tượng cảm xúc là một phần khó khăn trong việc tạo hình ảnh lập trình. Với pictex, vấn đề này được giải quyết từ đầu đến chân.

  • Trong hầu hết các trường hợp, thay thế font tự động hoạt động hoàn hảo và không cần mã bổ sung.
  • Để kiểm soát sáng tạo hoàn toàn, phương thức .font_fallbacks() cho bạn quyền định nghĩa danh sách font ưu tiên của riêng bạn, đảm bảo sự đồng nhất về phong cách trên các bộ ký tự khác nhau.

Ngừng chiến đấu với tofu và bắt đầu tạo ra những hình ảnh văn bản đẹp và đáng tin cậy ngay hôm nay.

Nếu bạn thấy bài hướng dẫn này hữu ích, tôi khuyến khích bạn khám phá kho GitHub.

Chúc bạn lập trình vui vẻ!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào