PNG उस क्रम में फिल्टर + LZ77 + हफ़मैन (LZ77 + हफ़मैन के संयोजन को डिफलेट कहा जाता है) का संयोजन है:
चरण 1) यदि फ़िल्टर किसी से अलग नहीं है, तो पिक्सल के मूल्य को आसन्न पिक्सल से अंतर से बदल दिया जाता है (अधिक जानकारी के लिए http://www.libpng.org/pub/png/book/chapter09.html देखें ) । यह ग्रेडिएंट्स के साथ छवियों के संपीड़न को बढ़ाता है (इसलिए ... 4 5 6 7 बन जाता है ... 1 1 1 1) और यह उसी रंग के क्षेत्रों में मदद कर सकता है (... 3 3 3 5 5 5 5 5 0 हो जाता है 0 0 2 0 0 0 0 0)। डिफ़ॉल्ट फ़िल्टर 24-बिट छवियों में सक्षम होते हैं और पैलेट के साथ 8-बिट्स छवियों में अक्षम होते हैं।
चरण 2) डेटा LZ77 के साथ संपीड़ित होता है जो बाइट के बार-बार (मिलान) तारों को एक ट्यूपल के साथ मैच की दूरी और मैच की लंबाई से बदल देता है।
चरण 3) चरण 2 का परिणाम हफमैन कोड के साथ एन्कोड किया गया है जो निश्चित लंबाई के प्रतीकों को चर-लंबाई कोडों के साथ बदलता है, जितना अधिक बार प्रतीक उतना छोटा कोड होता है।
कई मुद्दे हैं:
कुछ पिक्सेल को प्रभावित करने वाले एक छोटे से परिवर्तन से परिणाम में परिवर्तन png संपीड़न के 3 चरणों से होगा:
1) आसन्न पिक्सेल का फ़िल्टर्ड मान बदल जाएगा (उपयोग किए गए फ़िल्टर के आधार पर)। यह छोटे परिवर्तनों के प्रभाव को बढ़ाएगा।
2) परिवर्तन का मतलब यह होगा कि उस क्षेत्र के मैच अलग-अलग होंगे। उदाहरण के लिए 333333 से 333533 को बदलने का कारण बनता है कि 333333 की एक और घटना अब मेल नहीं खाएगी इसलिए यह 333333 के लिए एक अलग दूरी के साथ एक और मैच का चयन करेगा या यह एक ही मैच का चयन करेगा लेकिन कम लंबाई के साथ और फिर पिछले तीन 3 मिनट के लिए एक और मैच। अपने आप से कि परिणाम बहुत बदल जाएगा।
3) सबसे बड़ा मुद्दा चरण 3 में है। हफ़मैन कोड बिट्स की एक परिवर्तनीय संख्या का उपयोग करता है इसलिए यहां तक कि एक छोटे से परिवर्तन का परिणाम होगा कि जो कुछ भी अनुसरण करता है वह अब संरेखित नहीं है। AFAIK अधिकांश संपीड़न एल्गोरिदम उन मैचों का पता नहीं लगा सकते हैं जो बाइट संरेखित नहीं हैं ताकि पहले से संपीड़ित डेटा पर रोक (या कम से कम बहुत कम) संपीड़न हो सके जो परिवर्तन का अनुसरण करता है जब तक कि कंप्रेसर बाइट संरेखित नहीं होने वाले मैचों का पता लगा सकता है।
अन्य मुद्दों को पहले से ही अन्य उत्तरों द्वारा कवर किया गया है:
4) Gzip एक ही Deflate एल्गोरिथ्म का उपयोग 32KB डिक्शनरी के साथ करता है, इसलिए यदि png फाइलें 32KB से बड़ी हैं, तो मैच का पता नहीं चलेगा भले ही वे समान हों। Bzip2 उस पहलू में बेहतर है क्योंकि यह 900 KB ब्लॉक का उपयोग करता है। XZ LZMA का उपयोग करता है, जिसका IIRC डिफ़ॉल्ट संपीड़न स्तर में 4 एमबी शब्दकोश है। 5) ज़िप प्रारूप ठोस संपीड़न का उपयोग नहीं करता है इसलिए यह समान या समान फ़ाइलों को किसी भी बेहतर संपीड़ित नहीं करेगा।
शायद PAQ या PPMD परिवार के कंप्रेशर्स बेहतर संपीड़ित करेंगे लेकिन अगर आपको बहुत सारी समान छवि फ़ाइलों को संपीड़ित करने की आवश्यकता है, तो आप 3 विकल्प देख सकते हैं:
1) छवियों को असम्पीडित (PNG -0 के साथ या बिना संपीड़न के एक प्रारूप में) स्टोर करें और एक कंप्रेसर के साथ एक बड़े शब्दकोश या ब्लॉक आकार के साथ संपीड़ित करें। (LZMA अच्छा काम करेगा)
2) एक अन्य विकल्प फ़िल्टर रखना होगा लेकिन PNGs से डीफ़्लैट संपीड़न हटा दें। उदाहरण के लिए ( AdvDef ) उपयोगिता के साथ किया जा सकता है । तब आप परिणामी असम्पीडित PNGs को संपीड़ित करते हैं। विघटन के बाद आप असम्पीडित PNG को रख सकते हैं या उन्हें AdvDef के साथ फिर से संपीड़ित कर सकते हैं (लेकिन इसमें समय लगेगा)।
आपको यह देखने के लिए दोनों तरीकों का परीक्षण करने की आवश्यकता है कि कौन सा सबसे संकुचित करता है।
3) अंतिम विकल्प एक वीडियो में png छवियों को परिवर्तित करना होगा, इसे x264 दोषरहित (सही रंग प्रारूप का उपयोग करने का विशेष ध्यान रखना) जैसे दोषरहित वीडियो कंप्रेसर के साथ संपीड़ित करें और फिर निष्कर्षण पर अलग-अलग png छवियों को फ़्रेम निकालें। यह ffmpeg के साथ किया जा सकता है। आपको फ्रेम नंबर और मूल नाम के बीच मैपिंग भी रखनी होगी।
यह सबसे जटिल दृष्टिकोण होगा लेकिन अगर pngs किसी एनीमेशन का हिस्सा हैं तो यह सबसे प्रभावी हो सकता है। हालाँकि आपको एक वीडियो प्रारूप की आवश्यकता होगी जो पारदर्शिता का समर्थन करता है यदि आपको इसकी आवश्यकता है।
संपादित करें: MNG प्रारूप भी है जिसका उपयोग अक्सर नहीं किया जाता है।