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:
- Ön sıkıştırma: filtreleme (tahmin)
- 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:
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