S
Supanote
Sign in Sign up

Tệp tên PNG chưa chắc là ảnh PNG: kiểm tra đầu vào trước khi dịch truyện

markdown 2 hours ago · 87 lines · 3 views

Bạn nhận sáu trang truyện từ một thư mục chia sẻ. Tất cả tên tệp đều kết thúc bằng .png, nhưng một trang không mở được. Đổi tên rồi thử tải lại có thể làm thư mục trông gọn hơn, song không giải thích được lỗi. Với người xây công cụ hỗ trợ dịch truyện, câu hỏi đầu tiên nên là: bộ giải mã có đọc được nội dung này thành ảnh hay không?

Bài này đề xuất một cửa kiểm tra nhỏ trước bước nhận chữ. Nó dành cho người viết script chuẩn bị ảnh, không phải hướng dẫn vượt giới hạn của dịch vụ. Các tệp minh họa đều được tạo mới tại máy, không chứa truyện của bên khác. Mã đã được chạy với Pillow 10.2.0; đây là thử nghiệm bộ kiểm tra cục bộ, không phải kết quả kiểm thử MangaTranslate hay một hệ OCR.

Bài được soạn với hỗ trợ AI cho MangaTranslate, sản phẩm của Ficory LLC. Mối liên hệ thương hiệu được công bố để người đọc phân biệt phần hướng dẫn với một đánh giá độc lập.

Ba câu hỏi khác nhau về cùng một tệp

Tên mở rộng là một nhãn do người lưu hoặc người đổi tên đặt ra. Bộ giải mã nhận diện định dạng từ nội dung theo khả năng của thư viện. Sau đó, việc giải mã toàn bộ dữ liệu mới cho biết có đọc được các điểm ảnh trong lần kiểm tra này hay không. Ba câu trả lời ấy có thể không trùng nhau.

Chẳng hạn, một ảnh PNG hợp lệ được đổi tên thành trang.jpg vẫn chứa dữ liệu PNG. Ngược lại, một trang HTML được lưu nhầm thành trang.png không biến thành ảnh vì có hậu tố mới. Cũng có trường hợp phần đầu tệp còn nguyên nhưng dữ liệu phía sau đã bị cắt trong lúc sao chép.

Đừng suy từ nhãn trên giao diện thành kết luận rằng OCR nhận chữ sai. Nếu dữ liệu ảnh chưa đọc được, nhóm đang gặp vấn đề đầu vào trước khi có thể đánh giá nhận dạng hay dịch thuật. Tách hai giai đoạn giúp người xử lý không sửa nhầm lời thoại để bù cho một tệp bị hỏng.

Một bộ kiểm tra có phạm vi hẹp

Đoạn Python dưới đây chỉ xử lý PNG, JPEG và WebP. PDF, AVIF, ZIP cùng các loại khác được chuyển sang luồng riêng; việc không kiểm tra chúng ở đây không có nghĩa là sản phẩm đích không hỗ trợ chúng. Hai ngưỡng 16 MiB và 20 triệu điểm ảnh là chính sách minh họa của script, không phải giới hạn của MangaTranslate.

from pathlib import Path
from PIL import Image, UnidentifiedImageError

ALLOWED = {'.png': 'PNG', '.jpg': 'JPEG', '.jpeg': 'JPEG', '.webp': 'WEBP'}

def inspect_image(path):
    if path.stat().st_size > 16 * 1024 * 1024:
        return 'HOLD: local byte limit'
    expected = ALLOWED.get(path.suffix.lower())
    if expected is None:
        return 'HOLD: outside this checker'
    try:
        with Image.open(path) as image:
            actual = image.format
            if image.width * image.height > 20_000_000:
                return 'HOLD: local pixel limit'
            if getattr(image, 'n_frames', 1) != 1:
                return 'HOLD: multiple frames'
            image.load()
        if actual != expected:
            return f'HOLD: extension says {expected}, decoder says {actual}'
        return f'PASS: {actual}'
    except (UnidentifiedImageError, OSError, Image.DecompressionBombError):
        return 'HOLD: cannot decode safely in this checker'

Truyền một đối tượng Path vào hàm, ví dụ inspect_image(Path('trang.png')). Theo tài liệu chính thức của Pillow Image, mở ảnh có thể trì hoãn việc đọc dữ liệu điểm ảnh. Vì thế ví dụ gọi load() trước khi trả về PASS, thay vì chỉ nhìn thuộc tính định dạng rồi kết thúc.

PASS ở đây có nghĩa hẹp: tệp đi qua các điều kiện của hàm trong môi trường đã chạy. Nó không chứng minh nội dung không độc hại, không bảo đảm mọi bộ giải mã khác đều chấp nhận, cũng không đánh giá quyền sử dụng ảnh. Công cụ nhận tệp từ nguồn không tin cậy vẫn cần cập nhật thư viện và giới hạn tài nguyên phù hợp.

Sáu mẫu tự tạo cho thấy điều gì?

Bộ minh họa bắt đầu từ một ảnh trắng RGB kích thước 64 × 48, được lưu thành PNG. Không cần lấy ảnh truyện trên mạng để kiểm tra nhánh lỗi. Từ dữ liệu đó, tạo một bản có tên đúng, một bản đổi hậu tố, một bản bị cắt và một bản có hậu tố ngoài phạm vi. Thêm một tệp HTML giả ảnh và một JPEG hợp lệ để đối chiếu.

Tệp minh họa Kết quả thực tế của hàm
01-valid.png PASS: PNG
02-png-renamed.jpg HOLD: extension says JPEG, decoder says PNG
03-html-renamed.png HOLD: cannot decode safely in this checker
04-truncated.png HOLD: cannot decode safely in this checker
05-unknown.txt HOLD: outside this checker
06-valid.jpg PASS: JPEG

Kết quả không đo độ chính xác OCR. Ảnh trắng không có lời thoại để dịch. Mục đích là chứng minh mỗi mẫu được chuyển tới đúng nhánh xử lý dự kiến: tên lệch định dạng, không giải mã được, ngoài phạm vi hoặc đọc được.

Đặc biệt, mẫu .txt chứa cùng dữ liệu PNG vẫn được giữ lại để xem xét. Script không tự mở rộng phạm vi chỉ vì bên trong trông giống ảnh. Quyết định đó giúp quy trình có thể giải thích: khi chính sách đầu vào thay đổi, người quản lý sửa danh sách cho phép một cách có chủ đích.

HOLD không đồng nghĩa với xóa tệp

Một trạng thái giữ lại cần đi kèm hành động rõ ràng. Với tệp mang hậu tố sai nhưng giải mã được, hãy giữ bản gốc và hỏi người gửi về cách xuất. Nếu tạo bản chuẩn hóa, lưu nó thành bản mới và ghi quan hệ với nguồn. Đừng ghi đè âm thầm rồi để người khác tưởng bản sửa là nguyên bản.

Với tệp không đọc được, thử đối chiếu dung lượng hoặc mã băm giữa nơi gửi và nơi nhận. Chỉ đối chiếu hai bản được phép truy cập; không đưa ảnh riêng tư lên công cụ ngẫu nhiên để xem có mở được hay không. Tải lại từ nguồn được phép có thể là bước phù hợp, còn đổi đuôi liên tục thường chỉ làm mất dấu nguyên nhân.

Với nhiều khung hình, hãy xác định nhóm cần dịch từng khung hay một ảnh tĩnh đại diện. Ví dụ cố ý không tự chọn khung đầu. Tương tự, PDF cần quy trình kiểm tra và kết xuất riêng, không nên bị đổi tên thành PNG để đi qua bộ lọc này.

Đưa ảnh đã kiểm tra vào bước dịch

Sau khi đã xác nhận quyền sử dụng và xử lý các tệp HOLD, bạn có thể chuyển một số trang đại diện sang bước dịch truyện tranh online. MangaTranslate giới thiệu luồng tải ảnh, nhận dạng chữ, dịch và chỉnh sửa bản ảnh trực tuyến. Công cụ hỗ trợ chuẩn bị bản nháp; người phụ trách vẫn cần đọc lại ý nghĩa và bố cục.

Trong giao diện hiện tại, chọn ngôn ngữ nguồn phù hợp với lựa chọn mô hình, đặt ngôn ngữ đích là tiếng Việt và kiểm tra thiết lập trước khi tải. Hướng dẫn ngay trên trang phân biệt cách các mô hình dùng lựa chọn ngôn ngữ nguồn. Đừng giả định mọi mô hình xử lý lựa chọn này giống nhau. Đọc lại thông báo đang hiển thị thay vì dựa vào một ảnh chụp giao diện cũ.

Bắt đầu bằng trang có chữ nhỏ, trang nhiều bong bóng hoặc trang có nền phức tạp trong bộ ảnh bạn được phép dùng. Xem kết quả nhận chữ, sửa tên riêng và lời thoại, rồi kiểm tra phông cùng dấu tiếng Việt trước khi xuất. Hạn mức, định dạng và chi phí dùng theo thông tin hiện hành trên dịch vụ; bài không hứa lượt dịch miễn phí cố định hay tỷ lệ đúng.

Nhật ký hữu ích chỉ cần đủ để tìm lỗi

Bạn có thể ghi tên nội bộ, trạng thái, định dạng giải mã và thời điểm kiểm tra trong bảng kê. Không cần chép toàn bộ lời thoại, đường dẫn chia sẻ có quyền truy cập hoặc thông tin đăng nhập vào log. Khi xin hỗ trợ, ưu tiên gửi mẫu tự tạo tái hiện được vấn đề thay vì cả chương chưa công bố.

Một lượt kiểm tra đầu vào tốt kết thúc bằng quyết định có thể hành động: đọc được và chuyển tiếp, cần hỏi lại người gửi, hoặc thuộc luồng xử lý khác. Sau đó mới đến đánh giá nhận chữ và bản dịch. Giữ ranh giới ấy giúp nhóm biết nên sửa tệp, sửa cấu hình hay sửa câu tiếng Việt ở bước tiếp theo.

No replies yet

Every reply is a note. Start a discussion, ask a question, or attach a code snippet.

Share Note

Download SVG
Social Card Preview
Open on mobile
Point your phone camera to open this note directly

Report this note

Notification