Động lực chính cho định dạng PNG là tạo ra một sự thay thế cho GIF không chỉ miễn phí mà còn là một sự cải tiến về cơ bản trong tất cả các khía cạnh. Kết quả là, nén PNG hoàn toàn không mất dữ liệu - nghĩa là dữ liệu ảnh gốc có thể được xây dựng lại chính xác, từng bit một - giống như trong GIF và hầu hết các dạng TIFF.
PNG sử dụng quy trình nén 2 giai đoạn:
- Nén trước: lọc (dự đoán)
- Nén: DEFLATE (xem wikipedia )
Bước tiền nén được gọi là lọc, là phương pháp biến đổi ngược lại dữ liệu hình ảnh để động cơ nén chính có thể hoạt động hiệu quả hơn.
Ví dụ đơn giản, hãy xem xét một chuỗi các byte tăng đồng đều từ 1 đến 255:
1, 2, 3, 4, 5, .... 255
Vì không có sự lặp lại trong chuỗi, nó nén rất kém hoặc không tốt chút nào. Nhưng một sửa đổi nhỏ của chuỗi - cụ thể là để riêng byte đầu tiên nhưng thay thế từng byte tiếp theo bằng sự khác biệt giữa nó và tiền thân của nó - biến chuỗi thành một tập hợp cực kỳ nén:
1, 1, 1, 1, 1, .... 1
Việc chuyển đổi ở trên là lossless, vì không có byte nào bị bỏ qua và hoàn toàn có thể đảo ngược. Kích thước nén của loạt này sẽ giảm đi nhiều, nhưng loạt ban đầu vẫn có thể được phục hồi hoàn hảo.
Dữ liệu hình ảnh thực tế hiếm khi hoàn hảo, nhưng lọc không cải thiện khả năng nén trong các ảnh thang độ xám và truecolor, và nó cũng có thể giúp trên một số hình ảnh bảng màu. PNG hỗ trợ năm loại bộ lọc và bộ mã hóa có thể chọn sử dụng bộ lọc khác nhau cho mỗi hàng pixel trong ảnh:
Thuật toán hoạt động trên các byte, nhưng đối với các pixel lớn (ví dụ: RGB 24 bit hoặc 64 bit RGBA) chỉ các byte tương ứng được so sánh, có nghĩa là các thành phần màu đỏ của màu pixel được xử lý tách biệt với các thành phần pixel màu lục và màu xanh lam.
Để chọn bộ lọc tốt nhất cho mỗi hàng, một bộ mã hóa sẽ cần kiểm tra tất cả các kết hợp có thể. Điều này rõ ràng là không thể, vì ngay cả một hình ảnh 20 hàng sẽ yêu cầu thử nghiệm hơn 95 nghìn tỷ kết hợp, trong đó "thử nghiệm" sẽ liên quan đến việc lọc và nén toàn bộ hình ảnh.
Mức nén thường được định nghĩa là các số từ 0 (không có) và 9 (tốt nhất). Chúng đề cập đến sự đánh đổi giữa tốc độ và kích thước và liên quan đến số lượng kết hợp các bộ lọc hàng sẽ được thử. Không có tiêu chuẩn nào liên quan đến các mức nén này, vì vậy mọi trình chỉnh sửa hình ảnh có thể có thuật toán riêng về số lượng bộ lọc cần thử khi tối ưu hóa kích thước hình ảnh.
Mức nén 0 có nghĩa là các bộ lọc hoàn toàn không được sử dụng, điều này nhanh nhưng lãng phí. Các mức cao hơn có nghĩa là ngày càng có nhiều kết hợp được thử trên các hàng hình ảnh và chỉ những kết hợp tốt nhất được giữ lại.
Tôi đoán rằng cách tiếp cận đơn giản nhất để nén tốt nhất là tăng dần thử nghiệm nén từng hàng với từng bộ lọc, lưu kết quả nhỏ nhất và lặp lại cho hàng tiếp theo. Số tiền này để lọc và nén toàn bộ hình ảnh năm lần, đây có thể là sự đánh đổi hợp lý cho một hình ảnh sẽ được truyền và giải mã nhiều lần. Các giá trị nén thấp hơn sẽ làm ít hơn, theo quyết định của nhà phát triển công cụ.
Ngoài các bộ lọc, mức nén cũng có thể ảnh hưởng đến mức nén zlib là một số trong khoảng từ 0 (không có Độ lệch) và 9 (Độ lệch tối đa). Mức 0-9 được chỉ định ảnh hưởng đến việc sử dụng bộ lọc, tính năng tối ưu hóa chính của PNG, vẫn phụ thuộc vào nhà phát triển công cụ.
Kết luận là PNG có một tham số nén có thể làm giảm đáng kể kích thước tệp, tất cả mà không làm mất dù chỉ một pixel.
Nguồn:
Tài liệu libpng đồ họa mạng di động Wikipedia
Chương 9 - Nén và lọc