PNG bir sıkıştırma parametresi olduğu için nasıl kayıpsızdır?


156

PNG dosyalarının kayıpsız sıkıştırma kullandığı söylenir. Ancak, ne zaman GIMP gibi bir resim düzenleyicisindeysem ve bir görüntüyü PNG dosyası olarak kaydetmeyi denediğimde, 0 ile 9 arasında değişen bir sıkıştırma parametresi ister. Sıkıştırılmış görüntü, PNG'yi kayıpsız hale nasıl getirir?

Yalnızca sıkıştırma parametresini 9 olarak ayarladığımda kayıpsız davranış alıyorum mı?


40
Kayıpsız sıkıştırma algoritmalarının çoğu, “çıktı boyutunu en aza indirmek için ne kadar çaba sarf edilmesi gerektiğini” kaydırıcıda genelleştirilen ayarlayıcılara (sözlük boyutu gibi) sahiptir. Bu ZIP, GZip, BZip2, LZMA, ... için geçerlidir
Daniel B

20
Soru farklı şekilde ifade edilebilir. Sıkıştırmadan kalite kaybı olmazsa, neden her zaman en küçük boyutu üreten sıkıştırmayı kullanmıyorsunuz? Cevap, daha sonra olacaktır çünkü daha fazla RAM ve sıkıştırmak ve açmak için daha fazla CPU zamanı gerektirir. Bazen daha hızlı sıkıştırma istersiniz ve sıkıştırma oranını pek önemsemezsiniz.
kasperd

14
PNG sıkıştırması, ZIPping dosyalarıyla neredeyse aynıdır. Onları daha fazla veya daha az sıkıştırabilir, ancak sıkıştırmasını açtığında kesin dosyayı geri alırsınız - kayıpsız hale getiren de budur.
mikebabcock

13
Zip ve Rar gibi çoğu sıkıştırma yazılımı, daha küçük dosya <--> daha kısa sürede seçim yapmanıza olanak sağlayan "sıkıştırma düzeyi" girmenize izin verir. Bu, bu yazılımın sıkıştırma sırasındaki verileri attığı anlamına gelmez. Bu ayar (GIMP, pngcrush, vb.) Benzerdir.
Salman

2
@ naxa: Kayıpsız png'nin gerçekte ne olduğu konusunda hiçbir uyarı yok. Her zaman% 100 kayıpsızdır. Bu makale yalnızca bazı eski tarayıcıların gama düzeltmeleri için PNG uygulamalarında sahip oldukları hatalar hakkında sizi uyarır. Ve bu, yalnızca rengi CSS renkleriyle eşleştirmeniz gerektiğinde (gama düzeltilmemiş) anlamlıdır.
Pauli L

Yanıtlar:


183

PNG kayıpsızdır. GIMP bu durumda en iyi kelimeyi kullanmıyor olabilir. Bunu "sıkıştırma kalitesi" veya başka bir deyişle "sıkıştırma düzeyi" olarak düşünün. Daha düşük sıkıştırma ile daha büyük bir dosya elde edersiniz, ancak üretilmesi daha az zaman alır, oysa daha yüksek sıkıştırma ile daha uzun süren daha küçük bir dosya elde edersiniz. Genellikle, en yüksek sıkıştırma seviyelerine yükselirken azalan geri dönüşler elde edersiniz (yani, süredeki artışa oranla büyüklükte küçülmez), ancak size bağlıdır.


42
Ayrıca, PNG sıkıştırması aslında her iki yönde yapılan ayarların kaynağın içeriğine bağlı olarak çıktı boyutunu küçültebileceği birçok ayarlanabilir parametreye sahiptir - basit bir "daha iyi" ve "daha kötü" kaydırıcıdan çok daha karmaşıktır. Genel amaçlar için, bu çok önemli değil, ancak mutlak en küçük olanı istiyorsanız, pngcrushbirçok varyasyonu mümkün olan en küçük ile karşılaştırabilen bir araç kullanın .
Bob

4
Daha yüksek bir sıkıştırma seviyesi sıkıştırma süresini arttırır, fakat aynı zamanda dekompresyonu da etkiler mi?
Nolonar

10
@Nolonar Genel olarak hayır; eğer daha yüksek bir sıkıştırma seviyesi genellikle dekompresyon süresini azaltır, çünkü okuması ve işlemesi gereken daha az veri vardır. Uzun sıkıştırma süresi, sıkıştırılacak kalıpları bulmak için daha kapsamlı bir iş yapmaktan kaynaklanmaktadır (aşırı basitleştirme).
kabarık

1
@fluffy LordNeckbeard'in cevabı, en düşük sıkıştırmanın kod çözme işleminden 5 kat daha uzun sürdü.
André Chalella

1
PNG için, olduğu daha iyi sıkıştırılmış dosyalar için daha uzun dekompresyon vakit geçirmeye oldukça yaygın. Sorun PNG'de olası bir hile, sıkıştırma algoritmasını, dosya küçüldükçe tekrar tekrar uygulamaktır. Boyut arttıkça, uygulamayı bırakmayı bırakırsınız. Bu nedenle, sıkıştırma algoritmasını 5 veya 6 kez uygulamanız oldukça muhtemeldir; bu, görüntüyü görüntülemek için dosyayı 5 veya 6 kez açmak zorunda olduğunuz anlamına gelir.
yo'

213

PNG sıkıştırılmış, ancak kayıpsız

Sıkıştırma seviyesi, dosya boyutu ile kodlama / kod çözme hızı arasındaki bir farktır. Aşırı genelleme yapmak için FLAC gibi resim dışı formatların bile benzer kavramları vardır.

Farklı sıkıştırma seviyeleri, aynı kodu çözülmüş çıktı

Her ne kadar dosya boyutları farklı olsa da, farklı sıkıştırma seviyeleri nedeniyle, kod çözülen gerçek çıktı aynı olacaktır.

Sen karşılaştırabilirsiniz MD5 ile deşifre çıkışların karmaları ffmpegkullanarak MD5 muxer .

Bu en iyi şekilde bazı örneklerle gösterilmiştir:

PNG dosyaları oluşturun:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • PNG çıkışı için varsayılan olarak ffmpegkullanılacaktır -compression_level 100.

Dosya boyutunu karşılaştır:

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

PNG dosyalarının kodunu çözün ve MD5 karma değerlerini gösterin:

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

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

Her iki karma aynı olduğundan, kod çözülmüş çıktıların (sıkıştırılmamış, ham video) tamamen aynı olduğundan emin olabilirsiniz.


26
+1, ffmpeg'in pngs ile başa çıkabileceğini bilmiyordu.
Lekensteyn

21
@Lekensteyn Ekran görüntüsü almak için harika . 30 saniye atlama ve ekran görüntüsü alma örneği: ffmpeg -ss 30 -i input -vframes 1 output.pngAyrıca , görüntülerin dışında video çekmek için de geçerlidir.
Kasım’da

PNG'nin her gerçekleştirilmesi gerektiğinde sıkıştırılması gerektiği anlamına mı geliyor? Çünkü eğer bu doğruysa, biz olmalıyız
akshay2000

Dosyayı diskten veya önbellekten yeniden okursanız, evet, sıkıştırılmamış olması gerekir. Aynı sayfa içinde önbellek muhtemelen dekompresyon versiyonunu tekrar kullanabilir.
David Mårtensson,

1
@ akshay2000 PNG'yi oluşturan programın nasıl çalıştığına bağlı olarak değişir. Genellikle dosya diskten okunur, sıkıştırılır ve RAM'de tamponlanır. RAM'de tamponlandığı sürece görüntüyü tekrar açmak gerekmez.
xZise

24

PNG sıkıştırması iki aşamada gerçekleşir.

  1. Sıkıştırma öncesi, görüntü verilerini yeniden düzenler, böylece genel amaçlı bir sıkıştırma algoritmasıyla daha sıkıştırılabilir olur.
  2. Gerçek sıkıştırma, kısa baytlarla değiştirilerek kopya bayt dizilerini arayan ve ortadan kaldıran DEFLATE ile yapılır.

2. adım çok zaman / kaynak yoğun bir görev olduğu için, temel zlib kütüphanesi (ham DEFLATE'in kapsüllenmesi) 1 = En hızlı sıkıştırma, 9 = En iyi sıkıştırma, 0 = Sıkıştırma yok arasında değişen bir sıkıştırma parametresi alır. 0-9 aralığının geldiği yer burasıdır ve GIMP bu parametreyi zlib'e indirir. 0 düzeyinde, png'nizin aslında eşdeğer bitmapten biraz daha büyük olacağını gözlemleyin.

Bununla birlikte, 9. seviye, zlib'in deneyeceği sadece "en iyisi" ve hala çok fazla bir uzlaşma çözümü .
Bunu gerçekten hissetmek için kapsamlı bir arama için 1000 kat daha fazla işlem gücü harcamak istiyorsanız, zlibfli yerine zopfli kullanarak% 3-8 daha yüksek veri yoğunluğu elde edebilirsiniz .
Sıkıştırma hala kayıpsız, bu sadece verilerin daha uygun bir DEFLATE temsilidir. Bu, zlib uyumlu kütüphanelerin sınırlarına yaklaşır ve bu nedenle PNG kullanarak elde etmenin mümkün olduğu gerçek "en iyi" sıkıştırmadır.


2
Not: Dekompresyon süresi, sıkıştırma seviyesinden bağımsız olarak aynıdır veya zopflipng kullanılırken yineleme sayısı.
Adria

16

PNG formatı için temel bir motivasyon, sadece ücretsiz olmayan aynı zamanda esasen her bakımdan bir iyileştirme olan GIF'in yerini almaktı. Sonuç olarak, PNG sıkıştırması tamamen kayıpsızdır - yani, orijinal görüntü verileri tam olarak bit için yeniden oluşturulabilir - tıpkı GIF ve çoğu TIFF formunda olduğu gibi.

PNG 2 aşamalı bir sıkıştırma işlemi kullanır:

  1. Ön sıkıştırma: filtreleme (tahmin)
  2. Sıkıştırma: DEFLATE (bakınız wikipedia )

Ön sıkıştırma adımı, ana sıkıştırma motorunun daha verimli çalışabilmesi için görüntü verilerini geri dönüşümlü bir şekilde dönüştürme yöntemi olan filtreleme olarak adlandırılır.

Basit bir örnek olarak, 1'den 255'e kadar eşit bir şekilde artan bir bayt dizisi düşünün:

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

Sekansta tekrarlama olmadığından, çok zayıf bir şekilde ya da hiç sıkıştırılmaz. Ancak, dizinin önemsiz bir modifikasyonu - yani ilk baytı yalnız bırakmak, ancak sonraki her baytı kendisiyle önceki sürüm arasındaki farkla değiştirmek - diziyi aşırı sıkıştırılabilir bir kümeye dönüştürür:

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

Yukarıdaki dönüşüm kayıpsızdır, çünkü hiçbir byte atlanmamıştır ve tamamen geri dönüşümlüdür. Bu serinin sıkıştırılmış boyutu çok azaltılacak, ancak orijinal seri hala mükemmel bir şekilde yeniden oluşturulabilir.

Gerçek görüntü verileri nadiren mükemmel değildir, ancak filtreleme gri tonlamalı ve gerçek renkli görüntülerde sıkıştırmayı geliştirir ve bazı palet görüntülerinde de yardımcı olabilir. PNG, beş filtre türünü destekler ve kodlayıcı, görüntüdeki her piksel sırası için farklı bir filtre kullanmayı seçebilir:

görüntü

Algoritma baytlarda çalışır, ancak büyük pikseller için (örneğin, 24 bit RGB veya 64 bit RGBA) yalnızca karşılık gelen baytlar karşılaştırılır, yani piksel renklerinin kırmızı bileşenleri yeşil ve mavi piksel bileşenlerinden ayrı olarak ele alınır.

Her satır için en iyi filtreyi seçmek için, bir kodlayıcının tüm olası kombinasyonları test etmesi gerekir. Bu, 20 satırlık bir görüntü bile, "test" in tüm görüntüyü filtrelemeyi ve sıkıştırmayı içereceği 95 trilyon kombinasyonun üzerinde test yapılmasını gerektirdiğinden açıkça mümkün değildir.

Sıkıştırma seviyeleri normalde 0 (yok) ve 9 (en iyi) arasındaki sayılar olarak tanımlanır. Bunlar, hız ve boyut arasındaki değişimlerdir ve kaç tane satır filtresi kombinasyonunun deneneceği ile ilgilidir. Bu sıkıştırma düzeyleriyle ilgili standartlar yoktur, bu nedenle her görüntü düzenleyicinin, görüntü boyutunu optimize ederken kaç tane filtre denemesi yapacağı konusunda kendi algoritmaları olabilir.

Sıkıştırma seviyesi 0, filtrelerin hiç kullanılmadığı anlamına gelir, bu hızlı ancak israftır. Daha yüksek seviyeler, görüntü satırlarında gittikçe daha fazla kombinasyonun denenmesi ve yalnızca en iyilerinin kalması anlamına gelir.

En iyi sıkıştırmaya en basit yaklaşımın, her bir filtreyi her bir sırayla aşamalı olarak test etmek, en küçük sonucu kaydetmek ve bir sonraki satır için tekrarlamak olduğunu tahmin ediyorum. Bu, görüntünün tamamını beş kez filtrelemek ve sıkıştırmak anlamına gelir; bu, birçok kez iletilecek ve kodu çözülecek bir görüntü için makul bir denge olabilir. Düşük sıkıştırma değerleri, aracın geliştiricisinin takdirine bağlı olarak daha düşük olacaktır.

Filtrelere ek olarak, sıkıştırma seviyesi ayrıca 0 (Deflate yok) ile 9 (maksimum Deflate) arasında bir sayı olan zlib sıkıştırma seviyesini de etkileyebilir. Belirtilen 0-9 seviyelerinin PNG'nin ana optimizasyon özelliği olan filtrelerin kullanımını nasıl etkilediği hala aracın geliştiricisine bağlıdır.

Sonuç olarak, PNG'nin hepsi tek bir piksele bile zarar vermeden dosya boyutunu önemli ölçüde azaltabilen bir sıkıştırma parametresine sahip olduğu sonucuna varılmıştır.

Kaynaklar:

Wikipedia Taşınabilir Ağ Grafikleri
libpng dokümantasyonu Bölüm 9 - Sıkıştırma ve Filtreleme


1
Sıkıştırma seviyesi ayarının filtrelerin kullanımını değiştirdiğini sanmıyorum. Seviye 1-9 ayarı muhtemelen sadece 1-9 zlib sıkıştırma seviyesini seçer ve seviye 0, deflate algoritmasının hiç kullanılmadığı anlamına gelir. Çoğu uygulama muhtemelen satır başına filtreleri değiştirmez, ancak her zaman yalnızca Path filtresini kullanın.
Pauli L

@PauliL: Kabul etmiyorum, çünkü PNG sıkıştırma yazılımının tüm karşılaştırmalarında, oluşturulan görüntülerin boyutları arasında çok büyük farklılıklar vardır. Tüm ürünler aynı kütüphane için aynı parametreleri kullanıyorsa, tüm boyutların aynı zamanda hızda olması gerekirdi.
harrymc

Bu tür karşılaştırmalarla bağlantınız var mı?
Pauli L

@ PauliL: Bu karşılaştırma ile hızlı bir arama yapıldı .
harrymc

@PauliL: Muhtemelen zlib sıkıştırma seviyelerinin PNG'nin sıkıştırma seviyesinden etkilendiği konusunda haklısınız. Yanıtımı buna göre değiştirdim, ancak sıkıştırma aracı tam olarak ne yaptıklarını belgelemiyor. Belki de en kötü sonucu elde eden takımların açıklaması, hiç filtreleme kullanmamaları, sadece zlib sıkıştırması kullanmalarıdır.
harrymc

5

Tamam, ödül için çok geç kaldım, ama yine de cevabım işte.

PNG her zaman kayıpsızdır . Sıkıştırma / Şişirme algoritmasını, zip programlarında kullanılanlara benzer şekilde kullanır.

Söndürme algoritması, tekrarlanan bayt dizilerini arar ve bunları etiketlerle değiştirir. Sıkıştırma seviyesi ayarı, programın bayt dizilerinin en iyi kombinasyonunu bulmak için ne kadar çaba harcadığını ve bunun için ne kadar bellek ayrıldığını belirler. Sıkıştırılmış dosya boyutu ile zaman ve bellek kullanımı arasında uzlaşma. Bununla birlikte, modern bilgisayarlar o kadar hızlıdır ve yeterli hafızaya sahiptir; bu nedenle, en yüksek sıkıştırma ayarından başka kullanmaya nadiren ihtiyaç duyulur.

Birçok PNG uygulaması sıkıştırma için zlib kütüphanesini kullanır. Zlib, 1-9 arası dokuz sıkıştırma seviyesine sahiptir. Gimp’in içindekileri bilmiyorum, ancak 0-9 sıkıştırma seviyesi ayarlarına sahip olduğundan (0 = sıkıştırma yok), bu ayarın sadece zlib'in sıkıştırma seviyesini seçtiğini varsayardım.

Söndürme algoritması genel amaçlı bir sıkıştırma algoritmasıdır , resimleri sıkıştırmak için tasarlanmamıştır. Diğer birçok kayıpsız görüntü dosyası formatının aksine, PNG formatı bununla sınırlı değildir. PNG sıkıştırması, 2D görüntüyü sıkıştırdığımız bilgisinden yararlanır . Buna filtreler denir .

(Burada filtre aslında biraz yanıltıcı bir terimdir. Görüntü içeriğini aslında değiştirmez, sadece farklı şekilde kodlar. Daha doğru ad, delta kodlayıcı olur.)

PNG spesifikasyonu 5 farklı filtre belirler (0 = yok dahil). Filtre , önceki pikselden sola, yukarı, köşegen veya bunların birleşiminden farklı olan mutlak piksel değerlerini değiştirir . Bu sıkıştırma oranını önemli ölçüde artırabilir. Görüntüdeki her tarama satırı farklı filtre kullanabilir. Kodlayıcı, her satır için en iyi filtreyi seçerek sıkıştırmayı optimize edebilir.

PNG dosya formatı ayrıntıları için, bkz. PNG Spesifikasyonu .

Neredeyse sonsuz sayıda kombinasyon olduğundan, hepsini denemek mümkün değildir. Bu nedenle etkili bir kombinasyon bulmak için farklı stratejiler geliştirilmiştir. Çoğu görüntü düzenleyici muhtemelen filtreleri satır satır optimize etmeyi denemez, bunun yerine sadece sabit filtreyi kullanır (büyük olasılıkla Paeth).

Bir komut satırı programı pngcrush en iyi sonucu bulmak için çeşitli stratejiler dener. Diğer programlar tarafından oluşturulan PNG dosyasının boyutunu önemli ölçüde azaltabilir, ancak daha büyük görüntülerde biraz zaman alabilir. Bkz Kaynak Forge - Pngcrush .


3

Kayıpsız malzemelerde sıkıştırma seviyesi her zaman sadece şifreleme kaynaklarını (genellikle zaman, bazen de RAM) bit oranına karşı işlem yapar. Kalite her zaman% 100'dür.

Tabii ki, kayıpsız kompresörler ASLA herhangi bir gerçek sıkıştırmayı garanti edemezler . Rastgele veri sıkıştırılamaz, bulunacak bir düzen yok ve benzerlik yok. Shannon bilgi teorisi ve hepsi. Kayıpsız veri sıkıştırmanın tüm noktası, insanların genellikle rastgele olmayan yüksek verilerle çalışmasıdır, ancak iletim ve depolama için, onu olabildiğince az bit halinde sıkıştırabiliriz. Umarım orijinalin Kolmogorov karmaşıklığına mümkün olduğunca yaklaşırız .

İster zip ister 7z genel veri, png görüntüler, flac audio veya h.264 (kayıpsız modda) video olsun, aynı şey. Lzma (7zip) ve bzip2 gibi bazı sıkıştırma algoritmalarında, sıkıştırma ayarının yükseltilmesi DECODER’in CPU süresini (bzip2) veya daha sık gerekli RAM miktarını (lzma ve bzip2, ve daha fazla referans çerçeveli h.264) artıracaktır. . Çoğu zaman, kod çözücünün RAM'da daha fazla kod çözülmüş çıktı kaydetmesi gerekir, çünkü bir sonraki baytı kod çözme birçok megabayt önce kodu çözülmüş bir bayt anlamına gelebilir (örneğin, yarım saniyeden önceki bir saniyeye en çok benzeyen bir video karesi geri 12 kareye referanslarla kodlanır) ). Bzip2 ile aynı şey ve büyük bir blok boyutu seçmek, ancak aynı zamanda daha yavaş açar. lzma değişken bir boyut sözlüğüne sahiptir ve 1 gerektiren bir dosya oluşturabilirsiniz.


Hmmm Tahrikli step motorun yank kontrolünü sağlayan bir uygulama gördüm ve garantili kayıpsız sıkıştırma sağlamak için doğrudan kafa tuttum. Yüksek çözünürlüklü bir saat kaynağınız varsa, Manchester kodlaması kolayca yenilebilir.
Joshua,

@Joshua: Daha yüksek yoğunluklu bir fiziksel depolama formatı kullanmak veri sıkıştırmayla aynı değil ...
SamB

0

İlk olarak, PNG her zaman kayıpsızdır. Belirgin paradoks, iki farklı sıkıştırma türünün mümkün olması (her tür veri için) gerçeğinden kaynaklanmaktadır: kayıpsız ve kayıpsız.

Kayıpsız sıkıştırma , çeşitli hileler kullanarak, her şeyi tutan ve herhangi bir yaklaşım yapmadan veriyi (örneğin dosya boyutu) sıkıştırır . Sonuç olarak, kayıpsız sıkıştırmanın aslında hiçbir şeyi sıkıştıramayacak olması mümkündür. (Teknik olarak yüksek entropiye sahip veriler kayıpsız yöntemler için sıkıştırmak için çok zor veya hatta imkansız olabilir.) Kayıplı sıkıştırma , gerçek verilere yaklaşır, ancak yaklaşım kusurludur, ancak bu hassasiyetin "atılması" tipik olarak daha iyi sıkıştırma sağlar.

İşte kayıpsız sıkıştırmanın önemsiz bir örneği: 1000 siyah pikselden oluşan bir görüntünüz varsa, değeri siyah olan 1000 kez saklamak yerine, bir sayım (1000) ve değer (siyah) saklayarak 1000 piksel sıkıştırabilirsiniz " görüntü "sadece iki sayıya. (Bu, çalışma uzunluğu kodlaması olarak adlandırılan kayıpsız bir sıkıştırma yönteminin kaba bir şeklidir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.