Chỉ để kiểm tra, hãy để tôi kiểm tra phân tích của ForeverWintr bằng thực nghiệm.
Loại hình ảnh đầu vào tồi tệ nhất để nén JPEG (hoặc bất kỳ nén nào , thực sự) là nhiễu RGB ngẫu nhiên đồng nhất, về mặt lý thuyết là không thể nén được. Vì vậy, hãy để tôi tạo một số bằng cách sử dụng các công cụ netpbm :
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(Nhiễu RGB ngẫu nhiên đồng nhất, định dạng PNG không mất dữ liệu, 903 kb)
Lưu ý (Tháng 3 năm 2017): Tôi khá chắc chắn hình ảnh ở trên có định dạng PNG khi lần đầu tiên tôi viết câu trả lời này và tải nó trở lại vào năm 2013. (Thậm chí còn có một nhận xét về quản lý màu bên dưới ngụ ý mạnh mẽ điều này.) Thật không may, nó sẽ dường như nó đã được chuyển đổi âm thầm thành JPEG tại một số điểm, làm cho việc so sánh trực quan ở đây trở nên vô dụng.
Tôi đã thử tải lại một hình ảnh thử nghiệm PNG mới, nhưng rõ ràng nó đã đạt đến một loại giới hạn kích thước tệp PNG tùy ý tại imgur và được tự động chuyển đổi thành JPEG. Tôi không chắc có cách nào khác trong vấn đề này không, nhưng ít nhất nếu bạn có quyền truy cập vào hộp Linux, bạn luôn có thể chạy lại các lệnh đã cho để tạo hình ảnh thử nghiệm của riêng mình. Trong mọi trường hợp, ngoài việc ngăn chặn so sánh trực tiếp chất lượng nén, điều này không làm mất hiệu lực phân tích dưới đây dưới bất kỳ hình thức nào.
OK, do đó, tệp PPM không nén có chiều dài 640 × 480 × 3 = 921.600 byte, cộng với 15 byte cho tiêu đề PPM tối thiểu, đúng như mong đợi. Cố gắng nén nó một cách dễ dàng bằng định dạng PNG cuối cùng chỉ tăng kích thước lên 2157 byte, có lẽ được đưa lên bởi các tiêu đề và siêu dữ liệu PNG và có thể có một chút không hiệu quả trong thuật toán nén khi cố nén dữ liệu không thể nén được.
(Có, đó là 3 byte cho mỗi pixel, không phải 4; ngay cả định dạng PPM, đơn giản như định dạng tệp đồ họa có thể nhận được, không đủ để lưu trữ một byte thứ tư vô dụng trên mỗi pixel trên đĩa. Có thể có một số lợi thế để làm như vậy trong bộ nhớ vì lý do căn chỉnh, đặc biệt là nếu bạn cũng cần lưu trữ kênh alpha, nhưng những lý do đó không áp dụng khi ghi hình ảnh vào tệp.)
OK, vậy còn JPEG thì sao? Trước tiên, hãy thử giảm thiểu tổn thất nén (chất lượng = 100, không lấy mẫu màu, DCT dấu phẩy động). Thật không may, pnmtojpeg
hướng dẫn không giải thích rõ ràng cách đặt tất cả các tùy chọn có liên quan (cụ thể, -sample
tùy chọn được liệt kê trong phần "Tùy chọn cho trình hướng dẫn", chỉ tham chiếu một tệp trong tài liệu libjpeg), vì vậy tôi sẽ chuyển đổi nó trong thay vào đó là GIMP. Các tập tin kết quả trông như thế này:
897249 rnd.jpg
(Độ nhiễu RGB nén RGB, chất lượng = 100, không có mẫu phụ sắc độ, 876 kb)
Cái gì, làm thế nào nó có thể nhỏ hơn? Không phải tôi vừa nói tiếng ồn thuần túy là không thể nén được sao? Vâng, điều này là, ngay cả ở chất lượng tối đa, nén JPEG bình thường không phải là khá mất mát. Mở lại hình ảnh trong GIMP và so sánh nó với bản gốc, người ta có thể thấy rằng một số pixel đã có các giá trị màu của chúng bị dịch chuyển theo một hoặc hai bước (trong số 256). Đó là những pixel mà thuật toán nén JPEG "bị lừa" và ném đi một chút ở đây, một điểm khác ở đó, nơi nó ước tính rằng sự thay đổi sẽ không đáng chú ý. Thật vậy, đối với mắt người không được trả tiền, kết quả khá khác biệt so với ban đầu, nhưng các bit bị loại bỏ đó làm tăng kích thước tệp có thể đo được, ngay cả sau khi tính toán tiêu đề và mã hóa.
Vì vậy, đó là chất lượng tối đa; Còn các cài đặt điển hình hơn, như pnmtojpeg
mặc định (quality = 75, bật mẫu phụ) thì sao? Hãy thử nó:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(Độ nhiễu RGB nén RGB, chất lượng = 75, lấy mẫu màu, 184 kb)
Ồ, từ 901 xuống còn 184 kb! Tuy nhiên, đó là nén khá tích cực và bạn chắc chắn có thể nhận ra sự khác biệt khi so sánh các hình ảnh một cách chặt chẽ. Hầu hết là do sự thay đổi sắc độ, về cơ bản chỉ cần loại bỏ 75% dữ liệu màu (màu sắc / độ bão hòa). Việc thử nó trong GIMP với tính năng lấy mẫu con bị vô hiệu hóa sẽ cho ra một tệp 350.618 byte vẫn trông (ít nhất là với mắt người), khá gần với bản gốc ngay cả khi được phóng to.
Dù sao, quan điểm của tất cả những điều này là chứng minh rằng, cho dù ảnh trên bầu trời đêm của bạn có ồn đến mức nào, và cho dù bạn có thể chọn chất lượng cao đến đâu, thì không có cách nào để tệp JPEG 640 × 480 có thể lớn hơn đáng kể hơn 900 kb. (Chà, trừ khi máy ảnh của bạn gắn cấu hình màu Exif nhiều megabyte với nó hoặc một cái gì đó không kém phần ngu ngốc, đó là.) Và nếu bạn đang sử dụng các cài đặt nén JPEG điển hình hơn, kích thước tệp hợp lý tối đa sẽ giảm xuống khoảng 200 kb hoặc hơn .