Định dạng hình ảnh: JPEG

JPEG là loại hình ảnh phổ biến nhất được sử dụng trên web và vì lý do chính đáng: trong nhiều thập kỷ, JPEG hầu như luôn là lựa chọn phù hợp để mã hoá ảnh. Trường hợp sử dụng ngay đó là: JPEG là viết tắt của "Joint Photographic Experts Group" (Nhóm chuyên gia chụp ảnh chung), một uỷ ban chịu trách nhiệm ban hành tiêu chuẩn đầu tiên vào năm 1992. Bạn sẽ thấy đuôi tệp cho định dạng JPEG là .jpg hoặc .jpeg, mặc dù đuôi tệp này hiếm khi được sử dụng trong thời nay.

Mặc dù tính năng nén không tổn hao nén dữ liệu hình ảnh một cách thụ động tốt nhất có thể, nhưng phương thức nén có tổn hao của JPEG tìm cơ hội để nén hiệu quả hơn nhờ những thay đổi nhỏ, thường không nhận thấy được đối với dữ liệu hình ảnh. JPEG mã hoá dữ liệu hình ảnh dưới dạng 8/8 khối pixel và mô tả các khối (chứ không phải từng pixel riêng lẻ bên trong) theo thuật toán.

Điều này nghe có vẻ khác biệt về mặt học thuật trên giấy: "GIF sử dụng lưới gồm các pixel, còn JPEG sử dụng một lưới gồm các lưới pixel nhỏ hơn". Trong thực tế, việc sử dụng các khối thay vì điểm ảnh cho thấy JPEG rất phù hợp với trường hợp sử dụng hình ảnh phổ biến hơn: đây là kiểu chuyển màu tinh tế, nhiều lớp tạo nên một bức ảnh trong thế giới thực.

Căn chỉnh theo chiều ngang các khối màu xanh lục, chuyển từ sáng đến tối.

Việc mô tả hiệu ứng chuyển màu (gradient) một pixel rất đơn giản bằng phương thức mã hoá kiểu GIF sẽ cực kỳ chi tiết:

Hàng một, các cột từ 1 đến 9 là #00CC00. Hàng một, cột 10 là #00BB00. Hàng một, cột 11 là #00AA00. Hàng một, cột 12 là #009900. Hàng một, cột 13 là #008800. Hàng một, cột mười bốn là #007700. Hàng một, cột 15 là #006600. Hàng một, cột 16 là #005500.

Việc mô tả hiệu ứng chuyển màu bằng phương thức mã hoá kiểu JPEG sẽ hiệu quả hơn rất nhiều:

Một lưới với tỷ lệ 8:16 gồm các khối màu xanh lục với màu sắc từ sáng đến tối.

Khối một là #00CC00. Khối hai là một độ dốc từ #00CC00 đến #005500.

Điểm nổi bật của JPEG là số lượng mức độ chi tiết "tần số cao" trong hình ảnh, thường không thể nhận thấy. Do đó, việc lưu hình ảnh dưới dạng JPEG thường có nghĩa là giảm chất lượng hình ảnh theo cách có thể đo lường được, nhưng không nhất thiết là hiển thị. Như bạn đã tìm hiểu, việc lượng tử bảng màu kiểu GIF là một thao tác tương đối đơn giản: giảm số lượng màu trong hình ảnh sẽ dẫn đến các tệp nhỏ hơn, nhưng theo cách có thể dễ dàng nhận biết bằng mắt người.

Trái lại, JPEG là một kỹ thuật thông minh trong việc thực hiện quá trình lượng tử hoá: quá trình nén có tổn hao của JPEG cố gắng định lượng nguồn hình ảnh theo cách khớp với cách mà hệ thống tâm thị giác của chúng ta định lượng thế giới xung quanh chúng ta. Trên thực tế, JPEG cố gắng loại bỏ những chi tiết mà chúng tôi không có khả năng nhìn thấy ngay từ đầu, để có thể nén thêm một số dữ liệu.

Hệ thống tâm thần và thị giác của con người tác động rất tốt đến việc "nén" những hình ảnh mà bạn liên tục chụp. Khi liếc nhanh ra ngoài khu vườn nhỏ của mình, tôi có thể xử lý ngay một lượng thông tin khổng lồ: chẳng hạn như từng bông hoa có màu sắc rực rỡ nổi bật. Tôi đăng ký ngay lập tức rằng đất có màu xám bụi và lá rủ xuống—cây của tôi cần nước. Những gì tôi thấy, nhưng không xử lý đầy đủ, là hình dạng, kích thước, góc và sắc xanh chính xác của bất kỳ lá nào bị rơi. Tất nhiên, tôi có thể chủ động tìm kiếm mức độ chi tiết đó, nhưng đơn giản là quá nhiều thông tin để tiếp nhận một cách thụ động và không mang lại lợi ích thực sự. Vì vậy, hệ thống tâm thần thị giác của tôi tự định lượng một chút, chắt lọc thông tin đó cho "những chiếc lá rủ xuống".

Trong thực tế, JPEG cũng hoạt động tương tự. Tính năng nén có tổn hao của JPEG làm giảm mức độ chi tiết trong hình ảnh theo cách có thể không được ghi nhận vào hệ thống thị giác "mất tích" tự nhiên của chúng tôi, nếu được thực hiện đúng cách, đồng thời mang lại nhiều cơ hội tiết kiệm băng thông hơn so với việc chỉ nén ảnh không mất dữ liệu.

Ví dụ: JPEG lợi dụng một trong những điểm yếu chính về mặt tâm thần và thị giác của chúng ta: mắt của chúng ta nhạy cảm với sự khác biệt về độ sáng hơn là sự khác biệt về màu sắc. Trước khi áp dụng quá trình nén, JPEG sử dụng một quy trình gọi là "biến đổi cosin rời rạc" để chia hình ảnh thành các tần số riêng biệt – "lớp" theo cách nói – thể hiện độ sáng (độ sáng) và sắc độ (màu sắc) hoặc "độ sáng" và "sắc độ".

Lớp luma được nén ở mức tối thiểu, chỉ loại bỏ các chi tiết nhỏ mà mắt người có thể không nhận thấy.

Các lớp sắc độ giảm đáng kể. Thay vì chỉ đơn giản là định lượng bảng màu của các lớp sắc độ như GIF, JPEG có thể thực hiện một quá trình gọi là "lấy mẫu con", trong đó lớp sắc độ được lưu trữ ở độ phân giải thấp hơn. Khi được kết hợp lại bằng cách kéo dài hiệu quả các lớp sắc độ có độ phân giải thấp hơn trên lớp luma, sự khác biệt thường không nhận thấy được. Sự khác biệt một chút về màu sắc có thể đáng chú ý nếu chúng ta so sánh song song nguồn hình ảnh gốc và ảnh JPEG, nhưng chỉ khi chúng ta biết chính xác những gì cần tìm.

Dù vậy, JPEG vẫn chưa phải là một giải pháp hoàn hảo. Giống như JPEG, chúng ta thường xuyên hé lộ quá trình nén, nhưng nếu đưa ra quá xa, hình ảnh này có thể trở nên rõ ràng vô cùng rõ ràng. Trên thực tế, nếu đã dành nhiều thời gian trên web (đặc biệt là trong những ngày qua) thì có thể bạn đã nhận thấy hậu quả của việc nén JPEG quá lâu:

Hình ảnh những bông hoa được nén với mức độ cao chứa nhiều đồ tạo tác trực quan.

Nếu nén dữ liệu hình ảnh quá mạnh, mức độ chi tiết sẽ giảm hơn nữa so với việc hệ thống thị giác – thị giác của chúng ta thường bỏ qua, do đó, tạo ảo giác bị phá vỡ. Rõ ràng là thông tin chi tiết bị thiếu. Vì JPEG hoạt động theo khối, nên các đường phân giới giữa các khối đó có thể bắt đầu hiển thị.

JPEG chuyển tiếp

Chế độ JPEG tăng dần (PJPEG) giúp sắp xếp lại quá trình kết xuất hình ảnh JPEG một cách hiệu quả. Ảnh JPEG "cơ sở" hiển thị từ trên xuống dưới khi quá trình chuyển diễn ra, còn ảnh JPEG tăng dần sẽ kết xuất thành một nhóm "quét" kích thước đầy đủ (tương tự như vậy) với mỗi lần quét giúp tăng chất lượng hình ảnh. Toàn bộ hình ảnh sẽ xuất hiện ngay lập tức, mặc dù bị mờ và tăng dần khi quá trình chuyển tiếp tục.

Ảnh GIF cho thấy tốc độ tải vượt trội của một ảnh JPEG liên tục so với một ảnh JPEG thông thường.

Có vẻ như khác biệt hoàn toàn về mặt kỹ thuật trên giấy, nhưng có một lợi ích rất lớn về mặt cảm nhận: bằng cách phân phối phiên bản hình ảnh với kích thước đầy đủ ngay lập tức thay vì cung cấp không gian trống, PJPEG có thể cảm thấy nhanh hơn so với tệp JPEG cơ sở cho người dùng cuối. Ngoài ra, ngoại trừ các hình ảnh nhỏ nhất, việc mã hoá hình ảnh dưới dạng PJPEG hầu như luôn có nghĩa là kích thước tệp nhỏ hơn so với JPEG cơ sở. Tuy nhiên, mỗi byte đều có ích.

Tuy nhiên, có một sự đánh đổi nhỏ: việc giải mã PJPEG phức tạp hơn ở phía máy khách, nghĩa là sẽ gây một chút căng thẳng cho trình duyệt và phần cứng của thiết bị trong quá trình kết xuất. Rất khó để định lượng chi phí kết xuất đó theo cách chính xác, nhưng rất nhỏ và khó có thể nhận thấy, ngoại trừ các thiết bị quá yếu. Đây là sự đánh đổi đáng giá và tất cả đã nói, luỹ tiến là phương pháp mặc định hợp lý bất cứ khi nào mã hoá hình ảnh dưới dạng JPEG.

Sử dụng JPEG

Có thể bạn sẽ cảm thấy hơi choáng ngợp trước tất cả thông tin này. Tuy nhiên, có một tin vui cho công việc hằng ngày của bạn: các thông số kỹ thuật cụ thể hơn của nén JPEG bị loại bỏ và thay vào đó sẽ được đưa ra dưới dạng một chế độ cài đặt "chất lượng" duy nhất: một số nguyên từ 0 đến 100. 0 cung cấp kích thước tệp nhỏ nhất có thể và chất lượng hình ảnh kém nhất có thể như bạn mong đợi. Khi bạn tăng từ 0 lên 100, cả chất lượng và kích thước tệp đều tăng. Tất nhiên, chế độ cài đặt này mang tính chủ quan – không phải mọi công cụ sẽ diễn giải giá trị "75" theo cách như nhau, và chất lượng nhận thức luôn thay đổi tuỳ theo nội dung của hình ảnh.

Để hiểu cách hoạt động của cài đặt nén này, hãy sử dụng một công cụ dựa trên web phổ biến để tối ưu hóa tệp hình ảnh: Squoosh.

Squoosh – do nhóm Chrome duy trì – cung cấp thông tin so sánh song song giữa các phương pháp mã hoá và định cấu hình đầu ra hình ảnh, với các tuỳ chọn cấu hình từ thanh trượt "chất lượng" chung 0-100, đến khả năng tinh chỉnh chi tiết về sắc độ so với lấy mẫu lại độ chói. Số "chất lượng" càng thấp thì độ nén càng cao và tệp thu được sẽ càng nhỏ.

Bảng cài đặt Squoosh, trong đó thanh trượt chất lượng được làm nổi bật.

Ở đây, với "chất lượng" được thiết lập là 60, kích thước tệp giảm 79%. Đừng để bị đánh lừa bởi các ảnh hưởng của nhãn này: mắt người sẽ không nhận thấy được sự khác biệt về chất lượng trên hầu hết các thang đo, ngay cả khi so sánh song song.

Để chuyển đổi hình ảnh nguồn sang định dạng JPEG liên tục, hãy chọn hộp có nhãn "kết xuất tiến bộ" trong "tuỳ chọn nâng cao". Một số tuỳ chọn cấu hình này gần như chắc chắn là để tìm hiểu sâu hơn so với yêu cầu của dự án web thông thường. Tuy nhiên, chúng có thể giúp bạn hiểu rõ hơn về tác động của phương pháp mã hoá JPEG đến chất lượng và kích thước tệp trong các trường hợp sử dụng thực tế.

Bảng điều khiển cài đặt Squoosh, trong đó chế độ hiển thị liên tục được làm nổi bật.

Trong thực tế, không có nhiều thông tin, mặc dù hiện nay chúng ta biết JPEG là nội bộ phức tạp đến mức nào. Squoosh chỉ là một trong vô số phương pháp lưu các tệp JPEG được tối ưu hoá, tất cả đều sử dụng phương pháp tương tự để xác định mức độ nén: một số nguyên duy nhất từ 0 đến 100.

Việc xác định mức độ nén lý tưởng cho hình ảnh là một trò chơi tinh vi, vì tất cả độ phức tạp của phương thức mã hoá JPEG đang được rút gọn xuống một số nguyên duy nhất, đặc biệt là khi có quá nhiều bản lề trên nội dung của hình ảnh. Chẳng hạn như suy nghĩ về việc nhấp nháy hoặc thở, cân nhắc chế độ cài đặt nén JPEG sẽ thay đổi cảm nhận của chúng ta.

Bây giờ, nhìn lại bên ngoài, sau khi viết tất cả những điều này, quá trình xử lý tâm thần-hình ảnh của tôi đã trở nên thủ công hơn – bây giờ tôi đang xem từng chiếc lá, mặc dù bản thân hình ảnh vẫn không thay đổi. Điều đó khiến việc định cấu hình nén JPEG gặp khó khăn: bạn biết chính xác những loại lỗi hình ảnh cần tìm. Bằng cách suy nghĩ về việc nén hình ảnh, trước tiên, bạn sẽ tập trung vào từng lá cây — chúng ta nên phát hiện độ mờ nhẹ và cấu phần phần mềm nén không thường xuyên. Bạn càng khó tìm cấu phần phần mềm trong khi tinh chỉnh các chế độ cài đặt nén ảnh JPEG thì bạn càng có nhiều khả năng tìm thấy các cấu phần phần mềm đó trong khi người dùng có thể sẽ không tìm thấy. Ngay cả khi người dùng biết chính xác nội dung cần tìm, có khả năng họ sẽ không truy cập vào một trang khi họ dùng định dạng nén JPEG.

Do đó, hãy tránh việc tăng độ phân giải của hình ảnh để tìm cấu phần phần mềm, hoặc thậm chí là xem xét quá kỹ những phần trong hình ảnh mà bạn biết rằng cấu phần phần mềm sẽ xuất hiện đầu tiên. Đối với người dùng, các cấu phần phần mềm mờ pha trộn với các chi tiết nhỏ mà hệ thống tâm trí thị giác bị mất của họ thường làm mờ. Trên thực tế, ngay cả khi hiểu được các thủ thuật mà JPEG cố gắng thực hiện, bạn sẽ không nhận thấy các cấu phần phần mềm tương tự đó khi duyệt web trừ phi bạn tìm kiếm chúng. Vì lý do đó, hầu như luôn có một lựa chọn an toàn là nhắc nén tệp JPEG thấp hơn một chút so với mức bạn nghĩ – đặc biệt là khi hình ảnh đó sẽ hiển thị nhỏ hơn kích thước nội tại do việc tạo kiểu trực tiếp hoặc các hạn chế do bố cục xung quanh đặt ra.