PicScrub logoPicScrub
Quay lại danh sách định dạng

Định dạng PNG

Portable Network Graphics

Cấu trúc dựa trên chunk

PNG là một trong những định dạng file gọn gàng nhất. Mọi thứ đều được xếp vào các "chunk", tức những khối độc lập gồm kiểu, dữ liệu và mã kiểm tra. Điểm hay là bộ giải mã có thể bỏ qua những chunk nó không hiểu, nhờ vậy PNG hỗ trợ được siêu dữ liệu mà vẫn không làm hỏng phần mềm đời cũ.

Chỗ khéo nằm ở cách đặt tên chunk: nếu chữ cái đầu viết hoa thì đó là chunk "thiết yếu" (thiếu nó ảnh sẽ không hiển thị được). Chữ thường nghĩa là "phụ trợ", tức có thì tốt nhưng không bắt buộc. Toàn bộ những chunk siêu dữ liệu mà chúng ta quan tâm đều là chunk phụ trợ, nên xóa đi hoàn toàn an toàn.

Cấu trúc file PNG

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 byte
89 50 4E 47 0D 0A 1A 0A
IHDR
25 byte
Phần đầu ảnh (bắt buộc)
Metadata
100 byte
Các chunk tEXt, iTXt, eXIf
IDAT
Độ dài thay đổi
Dữ liệu ảnh đã nén
IEND
12 byte
Dấu kết thúc ảnh

Chữ ký PNG và chunk IHDR

Chữ ký PNG
Độ dài IHDR (13)
Kiểu chunk IHDR
Chiều rộng (256)
Chiều cao (256)
Độ sâu bit, kiểu màu, v.v.
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Cấu trúc một chunk

Độ dàiKiểuDữ liệuCRC32
4 byte4 byteThay đổi4 byte

Quy ước đặt tên kiểu chunk

  • • Chữ cái đầu viết hoa = chunk thiết yếu (bắt buộc phải hiểu được)
  • • Chữ cái đầu viết thường = chunk phụ trợ (không bắt buộc, có thể bỏ qua)
  • • Chữ cái thứ hai = công khai (viết hoa) hoặc riêng tư (viết thường)

Các chunk thiết yếu

Những chunk này phải có mặt và phải đọc được thì ảnh mới hợp lệ. PicScrub luôn giữ nguyên các chunk thiết yếu.

IHDR:phần đầu ảnh

Chunk đầu tiên sau chữ ký. Chứa chiều rộng, chiều cao, độ sâu bit, kiểu màu, phương pháp nén, phương pháp lọc và phương pháp xen kẽ dòng. Đúng 13 byte dữ liệu.

IDAT:dữ liệu ảnh

Chứa dữ liệu ảnh đã nén (zlib/deflate). Có thể được chia ra nhiều chunk IDAT. Các chunk IDAT bắt buộc phải nằm liền nhau.

IEND:kết thúc ảnh

Đánh dấu kết thúc luồng dữ liệu PNG. Bắt buộc là chunk cuối cùng. Không có byte dữ liệu nào.

PLTE:bảng màu

Bắt buộc với ảnh dùng màu chỉ mục (kiểu màu 3). Chứa từ 1 tới 256 mục màu RGB.

Các chunk siêu dữ liệu

Đây là những chunk phụ trợ có thể chứa siêu dữ liệu nhạy cảm với quyền riêng tư, và cũng là những chunk PicScrub xóa đi.

tEXt:văn bản không nén

Các cặp khóa/giá trị mã hóa Latin-1. Khóa thường gặp: Author, Description, Copyright, Creation Time, Software.

Format: keyword + null + text

zTXt:văn bản đã nén

Giống tEXt nhưng nén bằng zlib. Dùng cho những đoạn văn bản dài hơn.

iTXt:văn bản quốc tế

Văn bản UTF-8, có thể nén hoặc không. Hỗ trợ thẻ ngôn ngữ và từ khóa đã dịch. Dùng để chứa siêu dữ liệu XMP.

XMP keyword: XML:com.adobe.xmp\0

eXIf:dữ liệu EXIF

Được đăng ký làm phần mở rộng của PNG năm 2017. Chứa dữ liệu EXIF thô ở dạng TIFF, cấu trúc giống hệt EXIF trong JPEG. Có thể chứa GPS, ngày giờ chụp, thông tin thiết bị.

iCCP:hồ sơ màu ICC

Hồ sơ màu ICC nhúng sẵn, nén bằng zlib. PicScrub giữ lại theo mặc định để màu sắc không bị lệch.

tIME:thời điểm sửa lần cuối

Bảy byte: năm (2), tháng, ngày, giờ, phút, giây. Nó để lộ lần cuối ảnh được chỉnh sửa là khi nào.

Các chunk liên quan tới màu

Những chunk này ảnh hưởng tới cách hiển thị màu nhưng thường không chứa thông tin cá nhân. PicScrub giữ lại theo mặc định.

sRGB

Cho biết ảnh dùng không gian màu sRGB. Một byte cho ý đồ hiển thị màu.

gAMA

Giá trị gamma dạng số nguyên không dấu 4 byte (nhân với 100.000).

cHRM

Tọa độ các màu cơ bản và điểm trắng.

sBIT

Độ sâu bit gốc của từng kênh màu.

Kiểm tra CRC32

Mỗi chunk PNG đều kèm một mã kiểm tra CRC32 tính trên kiểu chunk và dữ liệu của nó, để bảo đảm dữ liệu còn nguyên vẹn.

Cách tính CRC

CRC32 input = chunk_type (4 bytes) + chunk_data (N bytes)
CRC32 output = 4 bytes appended after chunk data

// PNG uses CRC-32 polynomial: 0xEDB88320

Vì sao PicScrub kiểm tra CRC

Khi đọc file PNG, PicScrub kiểm tra CRC của từng chunk để bảo đảm dữ liệu còn nguyên vẹn. Những chunk hỏng được xử lý một cách nhẹ nhàng.

PicScrub xử lý PNG như thế nào

1

Kiểm tra chữ ký

Xác nhận chữ ký PNG: 89 50 4E 47 0D 0A 1A 0A

2

Đọc các chunk

Đọc độ dài, kiểu của từng chunk và kiểm tra CRC

3

Lọc bỏ chunk siêu dữ liệu

Nhận diện và bỏ qua các chunk tEXt, zTXt, iTXt, eXIf, tIME

4

Dựng lại file

Ghi chữ ký + các chunk đã lọc + IEND

Chunk được giữ lại

  • • IHDR, PLTE, IDAT, IEND (thiết yếu)
  • • sRGB, gAMA, cHRM (màu sắc)
  • • iCCP (hồ sơ màu, tùy chọn)
  • • pHYs (kích thước điểm ảnh)
  • • tRNS (độ trong suốt)

Chunk bị xóa

  • • tEXt (siêu dữ liệu văn bản)
  • • zTXt (văn bản đã nén)
  • • iTXt (văn bản quốc tế, XMP)
  • • eXIf (dữ liệu EXIF)
  • • tIME (thời điểm chỉnh sửa)