abox.tools

भाषा: हिन्दी

GIF के भीतर असल में क्या है

GIF आयतों का एक ढेर है, हर आयत के साथ एक घड़ी और रंगों की एक तालिका, और इस फ़ॉर्मैट से लोगों की लगभग हर शिकायत इन्हीं तीन में से किसी एक से आती है। यहाँ लिखा है कि हर हिस्सा करता क्या है, और आपकी फ़ाइल अपना आकार किस पर खर्च कर रही है यह कैसे पता चलेगा।

GIF एनालाइज़र खोलें फ़्रेम, देरी, पैलेट, और हर बाइट कहाँ गया।

Markdown के रूप में देखें

छोटा जवाब

GIF एक कैनवस है, उस पर पोतने के लिए आयतों की एक सूची है, और रंगों की एक तालिका है जो बताती है कि उन आयतों के भीतर लिखी संख्याओं का मतलब क्या है। हर आयत तीन चीज़ें साथ लाता है: उसे कितनी देर टिकाए रखना है, बाद में उसका क्या करना है, और चाहे तो अपनी अलग रंग-तालिका।

इस फ़ॉर्मैट के बारे में लोगों को जो कुछ अचरज भरा लगता है, वह लगभग सब उसी सूची से निकलता है। अगर आपकी GIF बहुत बड़ी है, तो या तो आयत हर बार पूरा कैनवस हैं, या उसमें तीन सौ रंग-तालिकाएँ पड़ी हैं। अगर वह बहुत धीमी चलती है, तो देरियाँ उस फ़र्श से नीचे हैं जिसके नीचे कोई ब्राउज़र नहीं जाता। और अगर वह लकीर छोड़ती है, तो वजह वह खाना है जिसे निपटान कहते हैं।

किसी खास फ़ाइल में इनमें से क्या है, यह देखने के लिए GIF एनालाइज़र खोलिए और उसे भीतर छोड़ दीजिए। इस पेज का बाकी हिस्सा बताता है कि वे संख्याएँ क्या कहती हैं।

किसी GIF का सारांश कार्ड: उसका संस्करण, कैनवस का नाप, फ़ाइल का नाप, फ़्रेमों की गिनती, कितनी बार दोहराता है और कितने रंग इस्तेमाल करता है।
वह सब कुछ जो कोई प्लेयर कभी नहीं दिखाता, एक ही फ़ाइल से।

फ़्रेम आयत हैं, तस्वीरें नहीं

जिन्होंने GIF सिर्फ़ चलती हुई देखी है, उन्हें यही हिस्सा चौंकाता है। फ़्रेम उस पल की ऐनिमेशन की तस्वीर नहीं है। वह एक आयत है, अपनी जगह और अपने आकार के साथ, और वह उसी के ऊपर पोता जाता है जो पहले के फ़्रेम छोड़ गए थे।

वह आयत पूरा कैनवस भी हो सकता है, और खराब बनी फ़ाइल में वह हमेशा होता ही है। पर GIF को इसकी छूट है कि वह सिर्फ़ तस्वीर का वही हिस्सा रखे जो पिछले फ़्रेम के बाद बदला — और जहाँ तस्वीर का ज़्यादातर हिस्सा स्थिर है, वहाँ यही 12 MB की फ़ाइल और 900 KB की फ़ाइल के बीच का फ़र्क है। इसीलिए लगभग स्थिर खिड़की की स्क्रीन रिकॉर्डिंग छोटी हो सकती है, और वही रिकॉर्डिंग किसी लापरवाह कन्वर्टर से निकलकर छोटी नहीं होती।

ऐनिमेशन देखकर आप नहीं बता सकते कि आपके पास कौन-सी है। दोनों एक जैसी दिखती हैं। देखने का अकेला तरीका यह है कि हर फ़्रेम क्या रखता है वह देखा जाए, और एनालाइज़र में वह नज़र ठीक इसीलिए है: उसे हर फ़्रेम जो रखता है सिर्फ़ वही पर कर दीजिए, और या तो आपको पारदर्शी पृष्ठभूमि पर छोटी-छोटी आकृतियों की एक कतार दिखेगी, जिसका मतलब है कि एनकोडर ने अपना काम किया, या फिर बार-बार पूरी तस्वीर दिखेगी, जिसका मतलब है कि नहीं किया।

इस फ़ॉर्मैट में कहीं भी मोशन कंपेंसेशन नहीं है। कुछ भी कभी “पिछली बार जैसा ही, बस चार पिक्सल बाएँ” की तरह नहीं रखा जाता, जैसा कोई वीडियो कोडेक करता। बदले हुए आयत वाली तरकीब ही GIF की अकेली बचत है, और वह बहुत कीमती है।

देरियाँ, और वह फ़र्श जो हर ब्राउज़र लागू करता है

हर फ़्रेम रखता है कि उसे कितनी देर थामे रखना है, सेकंड के सौवें हिस्सों में। फ़ॉर्मैट के पास यही एक इकाई है, इसलिए कोई फ़ाइल सबसे तेज़ जो माँग सकती है वह 0.01 सेकंड है — यानी सौ फ़्रेम प्रति सेकंड — और सबसे लंबी करीब 655 सेकंड।

उसे सौ फ़्रेम प्रति सेकंड मिलेंगे नहीं। हर ब्राउज़र 0.02 सेकंड से कम देरी को बढ़ाकर 0.10 कर देता है। यह नियम 1996 में Netscape Navigator में लिखा गया था, उस ज़माने के घूमते हुए ग्लोब और चलते हुए “निर्माण जारी” वाले बोर्डों के लिए, और उसके बाद हर ब्राउज़र ने उसे नकल कर लिया। किसी ने उसे कभी हटाया नहीं, और कोई हटाएगा भी नहीं।

तो जिस GIF के सारे फ़्रेम 0.01 s कहते हैं, वह सौ नहीं, दस फ़्रेम प्रति सेकंड चलती है। जिसने उसे बनाया उसके इरादे से दस गुना धीमी, और फ़ाइल इसका कोई इशारा नहीं देती: उसमें लिखी देरियाँ ठीक वही हैं जो माँगी गई थीं। इस फ़ॉर्मैट का यह सबसे आम अचरज है, और इसीलिए एनालाइज़र दो अवधियाँ बताता है — जो फ़ाइल कहती है, और जो ब्राउज़र असल में करेगा।

इलाज, फ़ाइल जहाँ भी बनी हो, यह है कि 0.01 की जगह 0.02 लिखा जाए। उससे 50 फ़्रेम प्रति सेकंड मिलते हैं, जो असली छत है, और किसी भी ज़रूरत से तेज़ है। व्यवहार में 0.05 s — बीस फ़्रेम प्रति सेकंड — लगभग उतना ही तेज़ है जितना माँगना समझदारी है।

देरियाँ एक बात और बताती हैं। अगर वे सब एक जैसी हैं, तो फ़ाइल तय दर वाले फ़्रेमों के समूह से बनी है। अगर वे बिखरी हुई हैं — यहाँ 0.04, वहाँ 0.11 — तो किसी चीज़ ने वीडियो बदला है और फ़्रेम गिराए हैं, और खाली जगह ढँकने के लिए पड़ोसी फ़्रेमों को खींच दिया है। और अगर आखिरी वाली बाकी सबसे कहीं लंबी है, तो वह जानबूझकर है: ऐनिमेशन को दोबारा शुरू होने से पहले ठहरने का तरीका यही है।

निपटान: वह खाना जो तय करता है कि लकीर छूटेगी या नहीं

हर फ़्रेम बताता है कि उसका समय पूरा होने पर स्क्रीन पर क्या छूटना चाहिए। चार संभव जवाब हैं और उन्हें जानना ठीक रहता है, क्योंकि ऐनिमेशन के गलत दिखने के चार में से तीन तरीके इसी खाने के गलत होने से आते हैं।

एक जगह स्पेसिफ़िकेशन और हकीकत अलग हो जाते हैं। “पृष्ठभूमि तक साफ़” फ़ाइल के हेडर में लिखे एक पृष्ठभूमि रंग की ओर इशारा करता है, और हर ब्राउज़र उसे अनदेखा करके पारदर्शी तक साफ़ करता है। पच्चीस साल से यही चल रहा है। जो फ़ाइल उस पृष्ठभूमि रंग के दिखने के भरोसे बनी है, वह उसके बनाने वाले को उसी सॉफ़्टवेयर में सही दिखेगी, और बाकी हर जगह गलत।

रंग-तालिकाएँ, और उनके 768 बाइट

GIF का पिक्सल कोई रंग नहीं है। वह एक संख्या है जो ज़्यादा से ज़्यादा 256 रंगों की तालिका की ओर इशारा करती है, और हर रंग तीन बाइट में रखा जाता है। इसलिए पूरी तालिका 768 बाइट की होती है, और एक फ़ाइल में या तो सबके लिए एक साझा तालिका हो सकती है, या हर फ़्रेम की अपनी, या दोनों।

दोनों इंतज़ाम जायज़ हैं और दोनों का सौदा अलग है:

एक दूसरी, चुपचाप लगने वाली कीमत भी है। रंग-तालिका की लंबाई दो की घात होनी चाहिए, इसलिए नौ रंग वाले फ़्रेम को भी सोलह की तालिका मिलती है और 130 रंग वाले को 256 की। कुछ हद तक ऊपर की ओर गोल करना टाला नहीं जा सकता। पर जिस फ़ाइल की तालिकाएँ पाँच हज़ार ऐसे रंग घोषित करती हों जिनका उसके पिक्सल कभी हवाला ही नहीं देते, वह अलग बात है: वे पैलेट किसी और तस्वीर के लिए बने थे, उस तस्वीर के लिए नहीं जो आखिर में फ़्रेम में पहुँची। एनालाइज़र बिना इस्तेमाल वाली प्रविष्टियों पर निशान लगा देता है, ताकि यह शक्ल एक नज़र में दिख जाए।

बाइट असल में जाते कहाँ हैं

GIF का हर बाइट गिनी-चुनी जगहों में से किसी एक में होता है, और यह तय करने से पहले कि फ़ाइल बहुत बड़ी है, यह जान लेना अच्छा है कि वे जगहें कौन-सी हैं।

इसे अंदाज़े से नहीं, तालिका की तरह देखने की वजह यह है कि जवाब हर फ़ाइल के लिए अलग होता है, और इलाज जवाब से ही निकलता है। जो फ़ाइल 95 % कंप्रेस किए पिक्सल है वह सीधे-सीधे बहुत सारी तस्वीर है, और वहाँ कम फ़्रेम, छोटा आकार या कम रंग ही काम आएँगे। जो फ़ाइल 30 % रंग-तालिकाएँ या 40 % XMP है, उसकी समस्या कहीं सस्ती है।

एक पट्टी जो GIF को इस हिसाब से बाँटती है कि उसके बाइट कहाँ गए, और हर फ़्रेम की एक पंक्ति उसका नाप तथा फ़ाइल में हिस्सा बताती है।
बाइट सचमुच कहाँ गए, फ़्रेम-दर-फ़्रेम। ज़्यादा बड़ी GIF लगभग हमेशा उसी कारण से बड़ी होती है जिसे यह साफ़ कर देता है।

लूप इस फ़ॉर्मैट का हिस्सा है ही नहीं

GIF की स्पेसिफ़िकेशन में ऐसा कोई खाना नहीं है जो कहे कि ऐनिमेशन दोहराई जाएगी। लूप एक ऐसे ब्लॉक से आता है जो Netscape ने 1995 में गढ़ा था — एक “ऐप्लिकेशन एक्सटेंशन” जिसमें NETSCAPE2.0 लिखा होता है — जिसे सबने वैसे भी लागू कर लिया और जो आज इंटरनेट की हर चलती GIF में है।

यानी जिस फ़ाइल में वह ब्लॉक नहीं है, वह हर ब्राउज़र में ठीक एक बार चलकर रुक जाती है, और बनाने वाले को टूटी हुई लगती है। अगर कोई ऐनिमेशन सिर्फ़ एक बार चलकर रह जाती है, तो वही ब्लॉक गायब है; सबसे पहले जाँचने लायक चीज़ों में यह एक है, और किसी भी व्यूअर में यह दिखता नहीं।

ब्लॉक एक गिनती भी बता सकता है — पाँच बार चलाइए और रुक जाइए। शून्य का मतलब है हमेशा, और लगभग हर फ़ाइल यही कहती है।

GIF और क्या-क्या ढो सकती है

तीन ब्लॉक ऐसे हैं जिनमें कोई तस्वीर नहीं होती और जिन्हें हर व्यूअर छोड़ देता है:

फ़ाइल कहीं भेजने से पहले तीनों के बारे में जान लेना अच्छा है: ये GIF के वे हिस्से हैं जो आपके बारे में कुछ कह सकते हैं, और जब तक कोई जानबूझकर इन्हें हटाए नहीं, ये हर नकल और हर दोबारा अपलोड में बचे रहते हैं।

खराब हो चुकी फ़ाइल पढ़ना

GIF कट जाती हैं — बीच में रुका डाउनलोड, खराब होती डिस्क से बचाई गई फ़ाइल, कोई ऐसी चीज़ जिसका आधा हिस्सा ही किसी ऐप ने लिखा। चूँकि यह फ़ॉर्मैट एक अनुक्रमित ढाँचा नहीं बल्कि ब्लॉकों की धारा है, कटी हुई GIF आम तौर पर वहीं तक पढ़ी जा सकती है जहाँ तक वह गई है: टूटन से पहले का हर फ़्रेम पूरा और सही सलामत होता है।

यह जानना काम का है क्योंकि ज़्यादातर सॉफ़्टवेयर ऐसी फ़ाइल को बस मना कर देते हैं। जो एनालाइज़र जहाँ तक पढ़ सकता है पढ़ता है और बता देता है कि वह कहाँ रुका, वह कम-से-कम यह तो बता देगा कि कितना बचा है, और जो नहीं है वह एक फ़्रेम है या आखिरी दो सौ।

उलटी समस्या भी होती है: फ़ाइल के अंत के निशान के बाद बैठे हुए बाइट। हर डिकोडर उस निशान पर रुक जाता है, इसलिए वे कभी पढ़े नहीं जाते और कभी बनते नहीं, और आम तौर पर वे किसी गड़बड़ी में पहली फ़ाइल के पीछे जुड़ गई दूसरी फ़ाइल होते हैं। वे बस वज़न हैं, और उन्हें काट देने से कुछ नहीं जाता।

इनमें से किसी के लिए अपलोड की ज़रूरत नहीं

GIF का ढाँचा पढ़ना कोई भारी काम नहीं है — यह ब्लॉकों की सूची पर एक टहलना है और एक छोटा-सा डीकंप्रेसर — और इसे करने के लिए फ़ाइल को सर्वर पर भेजने की कोई तकनीकी वजह कभी रही ही नहीं। यहाँ का GIF एनालाइज़र पूरा काम पेज के भीतर करता है: ब्लॉकों पर टहलना, LZW, स्क्रीन पर बनते फ़्रेम, और बाइटों का हिसाब।

इस काम में यह बाकी ज़्यादातर कामों से भी ज़्यादा मायने रखता है, क्योंकि जिन फ़ाइलों को लोग सबसे ज़्यादा खोलकर देखना चाहते हैं, वही अक्सर वे होती हैं जिन्हें साझा करने में वे सबसे कम आश्वस्त होते हैं — कहीं से बचाई गई कोई चीज़, किसी की भेजी हुई कोई चीज़, ऐसी कोई चीज़ जिसमें टिप्पणी वाला ब्लॉक है और जिसे उन्होंने अभी पढ़ा नहीं। फ़ाइलें अपलोड करने पर वह लंबी बात यहाँ उतनी ही लागू होती है जितनी इस साइट पर कहीं और।