Câu hỏi Làm thế nào là PNG lossless cho rằng nó có một tham số nén?


Các tệp PNG được cho là sử dụng nén không mất dữ liệu. Tuy nhiên, bất cứ khi nào tôi ở trong trình chỉnh sửa hình ảnh, chẳng hạn như GIMP và cố gắng lưu một hình ảnh dưới dạng tệp PNG, nó yêu cầu tham số nén, nằm trong khoảng từ 0 đến 9. Nếu nó có tham số nén ảnh hưởng đến độ chính xác trực quan của hình ảnh được nén, làm cách nào để PNG mất dữ liệu?

Tôi có nhận được hành vi mất mát chỉ khi tôi đặt tham số nén thành 9?


149
2017-11-26 18:11


gốc


Hầu hết các thuật toán nén không mất dữ liệu đều có thể điều chỉnh được (như kích thước từ điển) được tổng quát hóa trong thanh trượt "giảm thiểu dung lượng đầu ra". Điều này hợp lệ cho ZIP, GZip, BZip2, LZMA, ... - Daniel B
Câu hỏi có thể được nêu khác đi. Nếu không có chất lượng bị mất từ ​​nén, thì tại sao không phải lúc nào cũng sử dụng nén tạo ra kích thước nhỏ nhất? Câu trả lời sau đó sẽ là, bởi vì nó đòi hỏi nhiều RAM hơn và nhiều thời gian CPU hơn để nén và giải nén. Đôi khi bạn muốn nén nhanh hơn và không quan tâm nhiều đến tỷ lệ nén. - kasperd
Nén PNG gần giống với các tệp ZIPping. Bạn có thể nén chúng nhiều hơn hoặc ít hơn nhưng bạn lấy lại chính xác tập tin khi nó giải nén - đó là những gì làm cho nó mất dữ liệu. - mikebabcock
Hầu hết các phần mềm nén như Zip và Rar cho phép bạn nhập "mức độ nén" cho phép bạn chọn giữa tệp nhỏ hơn <-> thời gian ngắn hơn. Nó không có nghĩa là các phần mềm này loại bỏ dữ liệu trong quá trình nén. Cài đặt này (trong GIMP, pngcrush, v.v.) tương tự. - Salman A
@naxa: Không có sự cẩn trọng nào về việc png mất mát thực sự là như thế nào. Nó luôn luôn là 100% lossless. Bài viết này chỉ cảnh báo bạn về các lỗi mà một số trình duyệt cũ đã có trong quá trình triển khai PNG của họ để xử lý hiệu chỉnh gamma. Và điều đó chỉ có ý nghĩa nếu bạn cần phải phù hợp với màu sắc với màu CSS (không phải gamma được sửa). - Pauli L


Các câu trả lời:


PNG là mất mát. GIMP hầu như không sử dụng từ tốt nhất trong trường hợp này. Hãy nghĩ về nó như là "chất lượng nén", hay nói cách khác là "mức độ nén". Với nén thấp hơn, bạn nhận được một tệp lớn hơn, nhưng phải mất ít thời gian hơn để tạo, trong khi với nén cao hơn, bạn sẽ nhận được tệp nhỏ hơn cần nhiều thời gian hơn để tạo. Thông thường, bạn nhận được lợi nhuận giảm dần (nghĩa là, không giảm nhiều kích thước so với mức tăng thời gian cần thiết) khi lên tới mức nén cao nhất, nhưng tùy thuộc vào bạn.


181
2017-11-26 18:31



Ngoài ra, nén PNG thực sự có nhiều thông số có thể điều chỉnh trong đó điều chỉnh theo hai hướng có thể thu nhỏ kích thước đầu ra tùy thuộc vào nội dung của nguồn - phức tạp hơn nhiều so với thanh trượt "tốt hơn" và "tệ hơn" đơn giản. Vì mục đích chung, nó không quá quan trọng, nhưng nếu bạn muốn nhỏ nhất tuyệt đối thì hãy sử dụng một công cụ như pngcrush có thể so sánh nhiều biến thể cho nhỏ nhất có thể. - Bob
Mức nén cao hơn làm tăng thời gian nén, nhưng nó cũng ảnh hưởng đến giảm bớt sức ép cũng? - Nolonar
@Nolonar Nói chung là không; nếu mức độ nén cao hơn thường giảm thời gian giải nén vì có ít dữ liệu hơn để đọc và xử lý. Thời gian nén lâu hơn là do thực hiện một công việc kỹ lưỡng hơn trong việc tìm kiếm các mẫu để nén (oversimplifying). - fluffy
@fluffy LordNeckbeard của câu trả lời có nén cao nhất mất 5x dài hơn để giải mã hơn mức thấp nhất. - André Chalella
Đối với PNG, nó Là khá phổ biến để có thời gian giải nén lâu hơn cho các tệp được nén tốt hơn. Vấn đề là với PNG, một mẹo có thể là áp dụng thuật toán nén nhiều lần miễn là tệp nhỏ hơn. Khi kích thước tăng lên, bạn ngừng áp dụng nó. Vì vậy, bạn có thể áp dụng thuật toán nén 5 hoặc 6 lần, có nghĩa là bạn phải giải nén tệp 5 hoặc 6 lần để hiển thị hình ảnh. - yo'


PNG được nén nhưng không bị mất

Mức độ nén là sự cân bằng giữa kích thước tệp và tốc độ mã hóa / giải mã. Để khái quát hóa quá mức, ngay cả các định dạng không phải hình ảnh, chẳng hạn như FLAC, cũng có các khái niệm tương tự.

Các mức nén khác nhau, cùng một đầu ra được giải mã

Mặc dù kích thước tệp khác nhau, do mức độ nén khác nhau, đầu ra được giải mã thực tế sẽ giống nhau.

Bạn có thể so sánh MD5 băm của các đầu ra được giải mã với ffmpeg sử dụng MD5 muxer.

Điều này được thể hiện tốt nhất với một số ví dụ:

Tạo tệp PNG:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • Theo mặc định ffmpeg sẽ sử dụng -compression_level 100 cho đầu ra PNG.

So sánh kích thước tệp:

$ du -h *.png
  228K    0.png
  4.0K    100.png

Giải mã các tệp PNG và hiển thị băm MD5:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

Vì cả hai băm đều giống nhau nên bạn có thể yên tâm rằng các đầu ra được giải mã (video thô, không nén) chính xác giống nhau.


210
2017-11-27 08:27



1 không biết rằng ffmpeg có thể xử lý pngs. - Lekensteyn
@Lekensteyn Thật tuyệt vời cho tạo ảnh chụp màn hình. Ví dụ để bỏ qua 30 giây và chụp màn hình: ffmpeg -ss 30 -i input -vframes 1 output.png Cũng tốt cho tạo video ra khỏi hình ảnh và ngược lại. - LordNeckbeard
Liệu nó có nghĩa là PNG cần phải được giải nén mỗi lần nó phải được trả lại? Bởi vì nếu điều đó đúng, chúng ta phải - akshay2000
Nếu bạn đọc lại tệp từ đĩa hoặc bộ nhớ cache, có, nó phải được giải nén. Bên trong cùng một trang, bộ nhớ cache có thể sử dụng lại phiên bản giải nén. - David Mårtensson
@ akshay2000 Phụ thuộc vào cách chương trình hoạt động mà làm cho PNG. Thông thường các tập tin được đọc từ đĩa, giải nén và đệm trong RAM. Vì vậy, miễn là nó đệm trong RAM nó sẽ không cần phải giải nén hình ảnh một lần nữa. - xZise


Nén PNG xảy ra theo hai giai đoạn.

  1. Nén trước sắp xếp lại dữ liệu hình ảnh sao cho nó sẽ được nén hơn bằng thuật toán nén mục đích chung.
  2. Nén thực tế được thực hiện bởi DEFLATE, tìm kiếm và loại bỏ các chuỗi byte trùng lặp bằng cách thay thế chúng bằng các mã thông báo ngắn.

Vì bước 2 là một nhiệm vụ rất tốn thời gian / tài nguyên, thư viện zlib cơ bản (đóng gói của DEFLATE thô) lấy tham số nén từ 1 = Nén nhanh nhất, 9 = Nén tốt nhất, 0 = Không nén. Đó là nơi mà phạm vi 0-9 xuất phát, và GIMP chỉ cần chuyển tham số đó xuống zlib. Quan sát rằng ở mức 0 png của bạn sẽ thực sự lớn hơn một chút so với bitmap tương đương.

Tuy nhiên, cấp 9 chỉ là "tốt nhất" mà zlib sẽ cố gắng, và vẫn còn rất nhiều giải pháp thỏa hiệp.
Để thực sự cảm nhận được điều này, nếu bạn sẵn sàng chi tiêu 1000x sức mạnh xử lý nhiều hơn cho tìm kiếm toàn diện, bạn có thể đạt được mật độ dữ liệu cao hơn 3-8% bằng cách sử dụng zopfli thay vì zlib.
Nén vẫn không mất mát, nó chỉ là một đại diện DEFLATE tối ưu hơn của dữ liệu. Điều này tiếp cận các giới hạn của một thư viện tương thích zlib, và do đó là nén "tốt nhất" thực sự mà nó có thể đạt được bằng cách sử dụng PNG.


24
2017-11-28 09:55



Lưu ý: Thời gian giải nén là như nhau bất kể mức độ nén hoặc số lần lặp lại khi sử dụng zopflipng. - Adria


Một động lực chính cho định dạng PNG là tạo ra một thay thế cho GIF không chỉ miễn phí mà còn là một cải tiến về nó về cơ bản tất cả các khía cạnh. Kết quả là, nén PNG hoàn toàn mất dữ liệu - tức là, dữ liệu hình ảnh gốc có thể được xây dựng lại chính xác, bit cho bit - 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:

  1. Pre-compression: lọc (dự đoán)
  2. Nén: DEFLATE (xem wikipedia)

Bước giải nén được gọi là lọc, đó là một phương pháp đảo ngược chuyển đổi dữ liệu hình ảnh sao cho công cụ nén chính có thể hoạt động hiệu quả hơn.

Như một ví dụ đơn giản, hãy xem xét một chuỗi các byte tăng thống nhất từ ​​1 đến 255:

1, 2, 3, 4, 5, .... 255

Vì không có sự lặp lại trong trình tự, nó nén hoặc rất kém hoặc không hề gì cả. Nhưng một sửa đổi tầm thường của chuỗi - cụ thể là, để lại byte đầu tiên một mình nhưng thay thế từng byte tiếp theo bằng sự khác biệt giữa nó và người tiền nhiệm của nó - biến chuỗi thành một bộ cực kỳ nén:

1, 1, 1, 1, 1, .... 1

Việc chuyển đổi ở trên là không tổn hao, 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 bài này sẽ giảm nhiều nhưng chuỗi gốc vẫn có thể được hoàn nguyên hoàn toàn.

Dữ liệu hình ảnh thực tế hiếm khi hoàn hảo, nhưng bộ lọc cải thiện khả năng nén trong hình ảnh màu xám và không đúng màu, và nó cũng có thể hỗ trợ 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 cho mỗi hàng pixel trong hình ảnh:

image

Thuật toán hoạt động trên byte, nhưng đối với pixel lớn (ví dụ: RGB 24 bit hoặc RGBA 64 bit) chỉ các byte tương ứng được so sánh, nghĩa là các thành phần màu đỏ của các pixel-màu sắc được xử lý riêng biệt với các thành phần pixel màu xanh lá cây và màu lam.

Để chọn bộ lọc tốt nhất cho mỗi hàng, bộ mã hóa sẽ cần kiểm tra tất cả các kết hợp có thể có. Đ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 trê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à số giữa 0 (không) và 9 (tốt nhất). Những điều này đề cập đến sự cân bằng giữa tốc độ và kích thước và liên quan đến số lượng kết hợp của 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 đều có thể có các thuật toán riêng của mình 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 không được sử dụng chút nào, nhanh chóng nhưng lãng phí. Các cấp cao hơn có nghĩa là ngày càng nhiều kết hợp được thử trên các hàng hình ảnh và chỉ có các kết hợp tốt nhất những cái đượ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 bước thử nghiệm nén từng hàng với mỗi 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, có thể là một sự cân bằng hợp lý cho một hình ảnh sẽ được truyền và giải mã nhiều lần. Giá trị nén thấp hơn sẽ làm ít hơn, tùy 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ố giữa 0 (không có Deflate) và 9 (Deflate tối đa). Cách 0-9 được chỉ định mức độ ảnh hưởng đến việc sử dụng bộ lọc, là tính năng tối ưu hóa chính của PNG, vẫn còn phụ thuộc vào nhà phát triển của công cụ.

Kết luận là PNG có một tham số nén có thể làm giảm kích thước tập tin rất đáng kể, tất cả mà không bị mất ngay cả một điểm ảnh đơn lẻ.

Nguồn:

Wikipedia Mạng di động đồ họa
Tài liệu libpng Chương 9 - Nén và lọc


15
2017-11-29 15:12



Tôi không nghĩ rằng cài đặt mức nén thay đổi việc sử dụng bộ lọc. Thiết lập mức 1-9 có thể chỉ chọn mức nén zlib 1-9 và mức 0 có nghĩa là thuật toán giảm phát không được sử dụng chút nào. Hầu hết các triển khai có thể không thay đổi bộ lọc mỗi hàng, nhưng chỉ sử dụng bộ lọc Đường dẫn mọi lúc. - Pauli L
@PauliL: Tôi không đồng ý, bởi vì trong tất cả các so sánh của phần mềm nén PNG, có sự khác biệt rất lớn giữa kích thước của các hình ảnh được tạo ra. Nếu tất cả các sản phẩm sử dụng cùng các thông số cho cùng một thư viện, thì tất cả các kích thước phải giống nhau, cũng như tốc độ. - harrymc
Bạn có bất kỳ liên kết nào để so sánh như vậy không? - Pauli L
@PauliL: Tìm kiếm nhanh đã đưa ra so sánh này. - harrymc
@PauliL: Có thể bạn đã biết rằng mức nén zlib bị ảnh hưởng bởi mức độ nén của PNG. Tôi đã sửa đổi câu trả lời của tôi cho phù hợp, mặc dù không có công cụ nén tài liệu những gì họ làm chính xác. Có lẽ giải thích cho các công cụ có kết quả kích thước tồi tệ nhất là chúng không sử dụng bộ lọc nào cả, chỉ nén zlib. - harrymc


OK, tôi đã quá trễ cho tiền thưởng, nhưng đây là câu trả lời của tôi.

PNG luôn mất dữ liệu. Nó sử dụng thuật toán Deflate / Inflate, tương tự như thuật toán được sử dụng trong các chương trình zip.

Deflate thuật toán tìm kiếm chuỗi lặp đi lặp lại của byte và thay thế những người có thẻ. Cài đặt mức nén xác định mức độ nỗ lực mà chương trình sử dụng để tìm sự kết hợp tối ưu các chuỗi byte và lượng bộ nhớ được dành riêng cho điều đó. Đó là sự thỏa hiệp giữa thời gian và mức sử dụng bộ nhớ so với kích thước tệp nén. Tuy nhiên, các máy tính hiện đại rất nhanh và có đủ bộ nhớ để hiếm khi cần sử dụng ngoài cài đặt nén cao nhất.

Nhiều triển khai PNG sử dụng thư viện zlib để nén. Zlib có chín mức nén, 1-9. Tôi không biết nội bộ của GIMP, nhưng vì nó có cài đặt mức nén 0-9 (0 = không nén), tôi cho rằng thiết lập này chỉ đơn giản là chọn mức nén của zlib.

Thuật toán giảm tốc là một thuật toán nén mục đích chung, nó chưa được thiết kế để nén ảnh. Không giống như hầu hết các định dạng tệp hình ảnh lossless khác, định dạng PNG không bị giới hạn ở định dạng đó. Nén PNG tận dụng kiến ​​thức mà chúng tôi đang nén Hình ảnh 2D. Điều này đạt được bằng cái gọi là bộ lọc.

(Bộ lọc thực sự là một thuật ngữ gây hiểu lầm chút ở đây. Nó không thực sự thay đổi nội dung hình ảnh, nó chỉ mã hóa nó một cách khác nhau. Tên chính xác hơn sẽ là bộ mã hóa delta.)

Đặc điểm kỹ thuật PNG chỉ định 5 bộ lọc khác nhau (bao gồm 0 = không có). Bộ lọc thay thế các giá trị pixel tuyệt đối bằng sự khác biệt so với pixel trước ở bên trái, lên, chéo hoặc kết hợp những thứ đó. Điều này có thể cải thiện đáng kể tỷ lệ nén. Mỗi dòng quét trên hình ảnh có thể sử dụng bộ lọc khác nhau. Bộ mã hóa có thể tối ưu hóa quá trình nén bằng cách chọn bộ lọc tốt nhất cho mỗi dòng.

Để biết chi tiết về định dạng tệp PNG, hãy xem Đặc điểm kỹ thuật PNG.

Vì có vô số các kết hợp vô hạn nên không thể thử tất cả. Do đó, các loại chiến lược khác nhau đã được phát triển để tìm ra một sự kết hợp hiệu quả. Hầu hết các trình chỉnh sửa hình ảnh có thể thậm chí không cố gắng tối ưu hóa các bộ lọc theo từng dòng mà thay vào đó chỉ sử dụng bộ lọc cố định (có khả năng nhất là Paeth).

Một chương trình dòng lệnh pngcrush thử một số chiến lược để tìm kết quả tốt nhất. Nó có thể làm giảm đáng kể kích thước của tập tin PNG được tạo ra bởi các chương trình khác, nhưng nó có thể mất khá nhiều thời gian trên hình ảnh lớn hơn. Xem Nguồn Forge - pngcrush.


5
2017-11-30 13:45





Mức độ nén trong các công cụ lossless luôn là chỉ giao dịch tài nguyên mã hóa (thường là thời gian, đôi khi cũng là RAM) so với bitrate. Chất lượng luôn là 100%.

Tất nhiên, máy nén không bị mất có thể KHÔNG BAO GIỜ đảm bảo bất kỳ nén thực tế nào. Dữ liệu ngẫu nhiên không thể nén được, không có mẫu để tìm và không có sự giống nhau. Lý thuyết thông tin Shannon và tất cả những điều đó. Toàn bộ điểm nén dữ liệu không mất dữ liệu là con người thường làm việc với dữ liệu không phải ngẫu nhiên cao, nhưng để truyền và lưu trữ, chúng ta có thể nén nó xuống thành ít nhất có thể. Hy vọng rằng càng gần càng tốt để Độ phức tạp Kolmogorov của bản gốc.

Cho dù đó là dữ liệu chung của zip hoặc 7z, hình ảnh png, âm thanh flac hoặc h.264 (ở chế độ không mất dữ liệu), nó cũng giống nhau. Với một số thuật toán nén, như lzma (7zip) và bzip2, việc tăng cài đặt nén sẽ làm tăng thời gian CPU của DECODER (bzip2) hoặc thường xuyên hơn số lượng RAM cần thiết (lzma và bzip2 và h.264 với nhiều khung tham chiếu hơn) . Thông thường bộ giải mã phải tiết kiệm nhiều đầu ra giải mã trong RAM vì giải mã byte tiếp theo có thể tham chiếu đến byte được giải mã nhiều megabyte trước (ví dụ: một khung video tương tự như một nửa từ giây trước sẽ được mã hóa với tham chiếu đến 12 khung hình trở lại ). Cùng một điều với bzip2 và chọn một kích thước khối lớn, nhưng điều đó cũng giải nén chậm hơn. lzma có một từ điển có kích thước thay đổi và bạn có thể tạo các tệp yêu cầu 1,5 GB bộ nhớ RAM để giải mã.


3
2017-12-02 13:38



Hmmm Tôi thấy một thực hiện để yank kiểm soát của động cơ stepper ổ đĩa và đầu trực tiếp để cung cấp đảm bảo nén lossless. Mã hóa Manchester dễ bị đánh bại nếu bạn có nguồn đồng hồ có độ phân giải cao. - Joshua
@ Joshua: Sử dụng định dạng lưu trữ vật lý mật độ cao hơn không giống như nén dữ liệu ... - SamB


Thứ nhất, PNG luôn mất mát. Nghịch lý rõ ràng là do thực tế có hai loại nén khác nhau (đối với bất kỳ loại dữ liệu nào): mất mát và mất mát.

Nén không mất dữ liệu ép xuống dữ liệu (tức là kích thước tệp) bằng cách sử dụng các thủ thuật khác nhau, giữ mọi thứ và không thực hiện bất kỳ xấp xỉ nào. Kết quả là, có khả năng nén lossless sẽ không thực sự có thể nén mọi thứ. (Dữ liệu kỹ thuật với entropy cao có thể rất khó hoặc thậm chí không thể nén cho các phương pháp lossless.)     Nén mất dữ liệu xấp xỉ dữ liệu thực, nhưng xấp xỉ là không hoàn hảo, nhưng điều này "ném đi" độ chính xác cho phép nén tốt hơn thường.

Dưới đây là một ví dụ nhỏ về nén không mất dữ liệu: nếu bạn có một hình ảnh được tạo từ 1.000 pixel đen, thay vì lưu trữ giá trị cho 1.000 lần màu đen, bạn có thể lưu trữ số lượng (1000) và giá trị (đen), do đó nén 1000 pixel " hình ảnh "chỉ vào hai con số. (Đây là một dạng thô của một phương pháp nén không mất dữ liệu được gọi là mã hóa độ dài chạy).


0
2017-11-27 06:07