यह पेज हिन्दी में दिखाया जा रहा है, क्योंकि आपका ब्राउज़र यही भाषा माँगता है।
इस पेज का कोड चालू नहीं हुआ।
index.html को सीधे किसी फ़ोल्डर से खोलने पर ब्राउज़र JavaScript मॉड्यूल रोक देता है, इसलिए एक GIF चुनने पर कुछ नहीं होगा। इसके बजाय फ़ोल्डर को http पर सर्व कीजिए:
ऊपर फ़ाइल चुनते ही यह खुल जाएगा।तैयार — इंटरनेट काट दीजिए, यह फिर भी चलता रहेगा।इस ब्राउज़र में उपलब्ध नहीं (बाकी सब फिर भी चलता है)।ऑफ़लाइन कैश के लिए https:// या localhost चाहिए।यहाँ कैश नहीं हो सकता, पर अपलोड फिर भी कुछ नहीं होता।आपकी फ़ाइलें कहीं नहीं गईं। {total} फ़ाइलें लोड हुईं, और वे सब इसी साइट की अपनी हैं। {platform}किसी चीज़ ने {hosts} से संपर्क किया, और यह टूल ऐसा कभी नहीं करता। यह देखने लायक बात है। {platform}विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को न कोई फ़ाइल मिली, न उसका एक बाइट।विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को न कोई फ़ाइल मिली, न उसका एक बाइट।कुछ गड़बड़ हो गई: {detail}। दोबारा शुरू करने के लिए पेज फिर से लोड कीजिए।{count} फ़ाइल पढ़ी जा रही है…{count} फ़ाइलें पढ़ी जा रही हैं…कोई उदाहरण आज़माइएउदाहरण बनाया जा रहा है…यह ब्राउज़र उदाहरण नहीं बना सका। इसके बजाय कोई फ़ाइल चुनिए।
● यह टूल GIF कभी अपलोड नहीं करता। यहाँ कोई सर्वर है ही नहीं।
GIF को पढ़ना, खोलना और बनाना, तीनों आपका अपना ब्राउज़र करता है, और हर PNG इसी डिवाइस की मेमोरी में तैयार होती है। मान लीजिए यहाँ कुछ भेजना भी चाहता, तो इस पेज के दूसरी तरफ़ ऐसा कोई सर्वर ही नहीं है जिसे एनिमेशन भेजा जा सके।
✗ कोई अपलोड नहीं
✗ कोई खाता नहीं
✓ ऑफ़लाइन चलता है
✓ ओपन सोर्स
✓ फ़ाइलें आपके डिवाइस पर ही रहती हैं
लाइव जाँच:जाँच जारी…
ऑफ़लाइन:जाँच जारी…
हमारी बात पर भरोसा मत कीजिए। DevTools खोलिए, Network टैब पर नज़र रखिए, और कोई GIF बाँटकर देखिए। एक भी रिक्वेस्ट में न कोई तस्वीर जाती है, न कोई फ़्रेम, न फ़ाइल का नाम। या फिर इंटरनेट काट दीजिए और तब भी एक GIF बाँटकर देखिए।
प्राइवेसी का यह दावा कैसे जाँचा जा सकता है
आपके GIF के पास बाहर जाने का रास्ता ही नहीं है। Content-Security-Policy में वे सारे पते लिखे हैं जिनसे यह पेज बात कर सकता है, और उनमें से एक भी इस साइट का नहीं है। यहाँ ऐसा कोई ठिकाना है ही नहीं जहाँ आपकी फ़ाइलें इकट्ठी की जा सकें, और होता भी तो कोड में ऐसा कुछ नहीं है जो उन्हें वहाँ भेजे। पहले यहाँ connect-src 'none' लिखा था, जिसमें कोई अपवाद नहीं था। विज्ञापन की कीमत यही थी, और यह बता देना भी सौदे का हिस्सा है।
GIF पढ़ने वाला हिस्सा इस रिपॉज़िटरी की दो फ़ाइलें हैं। ब्राउज़र GIF चला तो देता है, पर उसके हिस्से आपको नहीं सौंपता, इसलिए फ़ॉर्मैट यहीं पढ़ा जाता है। src/gif.js कंटेनर और LZW डीकंप्रेसर है, और src/compose.js वे नियम हैं जो तय करते हैं कि पिछले फ़्रेम नीचे बिछ जाने के बाद यह फ़्रेम कैसा दिखेगा। फ़ाइल खोलने के लिए कुछ मँगाया नहीं जाता, और पहली बार इस्तेमाल पर कोई इंजन भी नहीं उतरता।
Google क्या लोड करता है, और उसे क्या नहीं दिया जाता। विज्ञापन और माप वाली स्क्रिप्ट Google से आती हैं। इनमें से किसी को भी आपके एनिमेशन के बारे में कुछ नहीं सौंपा जाता, न फ़ाइल, न कोई फ़्रेम, न नाम, न साइज़, न गिनती। तस्वीर पढ़ने, खोलने, बनाने या लिखने वाली हर पंक्ति इसी ऑरिजिन से आती है और रिपॉज़िटरी में मौजूद है।
दान का बटन क्या लोड करता है, और उसे क्या नहीं दिया जाता। हेडर वाला “Buy me a coffee” बटन cdnjs.buymeacoffee.com की एक स्क्रिप्ट बनाती है और अक्षर Google Fonts से आते हैं। वह एक लिंक से ज़्यादा कुछ नहीं है। न वह आपकी विज़िट की खबर देता है, न उसे आपके या आपकी फ़ाइलों के बारे में कुछ मिलता है। जब तक आप क्लिक न करें कुछ नहीं होता, और क्लिक करने पर जो खुलेगा वह किसी और की साइट है।
यह ऑफ़लाइन भी चलता है। नेटवर्क काट दीजिए, इस पेज का हर हिस्सा काम करता रहेगा। सबसे आसान सबूत यही है। जो टूल आपका एनिमेशन बाँटने के लिए कहीं भेजता, वह प्लग निकालते ही रुक जाता।
खुद जाँच लीजिए। ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा dist ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं:
सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए config/site.toml, फ़्रेम खोलने वाले रीडर के लिए src/gif.js, और उन्हें एक के ऊपर एक रखने के नियमों के लिए src/compose.js। दोनों में से किसी में भी ऐसी एक पंक्ति नहीं है जो नेटवर्क तक पहुँच सके।
अगर आपके दफ़्तर का सुरक्षा सॉफ़्टवेयर अपलोड की चेतावनी दे। वह उस पल पर नज़र रखता है जब ब्राउज़र में फ़ाइल चुनी जाती है, और यह नहीं जान सकता कि पन्ना उसे भेजने वाला है या नहीं — इसलिए चुनने पर ही चेतावनी देता है। यहाँ से कुछ नहीं भेजा जाता: ब्राउज़र के डेवलपर टूल खोलिए, Network पर जाइए, और एक फ़ाइल चुनिए। उसे ले जाने वाला कोई अनुरोध नहीं है, और पन्ने की अपनी स्थानीय झलक के अलावा कोई अनुरोध ही नहीं। यही जाँच आपकी IT टीम आधे मिनट में कर सकती है।
1 एक GIF चुनिए
फ़ाइल
—
साइज़
—
तस्वीर
—
फ़्रेम
—
चलती है
—
दोहराव
—
2 फ़्रेम किस रूप में निकलें
रखिए हर सारे के बजाय हर दूसरा या हर पाँचवाँ फ़्रेम लीजिए, किसी कॉन्टैक्ट शीट के लिए या लंबी रिकॉर्डिंग के लिए।
टाइमिंग सूची हर फ़्रेम कितनी देर टिका और कहाँ बैठा था। PNG से भरा फ़ोल्डर यह अपने आप साथ नहीं ले जा सकता।
हर फ़्रेम में लिख दिया जाता है। बाद में हटाया नहीं जा सकता।
फ़्रेम
3 फ़्रेम
GIF पढ़ी जा रही है…वह फ़ाइल पढ़ी नहीं जा सकी: {why}वह फ़ाइल GIF होने के लिए बहुत छोटी है।वह GIF नहीं है। फ़ाइल की शुरुआत GIF87a या GIF89a से नहीं होती।यह GIF बहुत बड़ी है: पहले {n} फ़्रेम ने वह मेमोरी भर दी जितनी यह पेज एक साथ रखने को तैयार है, इसलिए बाकी बिना पढ़े रह गए।यह GIF एक फ़्रेम के बीच में खत्म हो जाती है, इसलिए आखिरी फ़्रेम अधूरा हो सकता है।यह GIF खराब है: पहला फ़्रेम पूरा होने से पहले ही खत्म हो जाती है।उस GIF में ऐसा कोई फ़्रेम नहीं है जिसे यह रीडर खोल सका हो।1 फ़्रेम फ़ाइल में ही अधूरा रह जाता है; छूटे हुए पिक्सेल पारदर्शी निकलते हैं।{n} फ़्रेम फ़ाइल में ही अधूरे रह जाते हैं; छूटे हुए पिक्सेल पारदर्शी निकलते हैं।{n} फ़्रेम अपनी खुद की रंग-तालिका रखते हैं, इसीलिए यह GIF अपने आकार से लगने वाली उम्मीद से बड़ी है।फ़ाइल में एक टिप्पणी है: «{comment}»{a} {b}एक बार चलती है (कोई लूप ब्लॉक नहीं)हमेशा1 बार और{n} बार औरफ़्रेम {n}फ़्रेम बनाए जा रहे हैं…{played} (फ़ाइल में {stored}से){delay} — {width} x {height}{delay} — {x}, {y} पर {width} x {height} — {disposal}स्क्रीन पर बना रहता हैबाद में अपना हिस्सा मिटा देता हैनीचे जो था उसे लौटा देता है1 फ़्रेम, {picked} चुना गया{n} फ़्रेम, {picked} चुने गएफ़ाइल में जो है वही: हर फ़्रेम जो टुकड़ा दोबारा बनाता है, उसी के अपने आकार में। GIF इसी तरह छोटी रहती है, और एनिमेशन ऐसा दिखता नहीं है।हर PNG पूरी तस्वीर है, बिलकुल वैसी जैसी एनिमेशन का वह पल दिखता है। लगभग सबको यही चाहिए होता है।फ़्रेमहर दूसरा फ़्रेमहर तीसरा फ़्रेमहर {n}वाँ फ़्रेम{total} में से {done} फ़्रेम लिखा जा रहा है…इस ब्राउज़र ने PNG लिखने से मना कर दिया।इस ब्राउज़र ने पूर्वावलोकन बनाने से मना कर दिया।वह फ़्रेम लिखा नहीं जा सका: {why}वह शीट लिखी नहीं जा सकी: {why}फ़्रेम लिखे नहीं जा सके: {why}{name} के फ़्रेममूल में {width}x{height}, 1 फ़्रेममूल में {width}x{height}, {frames} फ़्रेमदेरियाँ वही हैं जो फ़ाइल में दर्ज हैं। ब्राउज़र 0.02से से कम कुछ भी 0.1से पर चलाता है, और वही चला कॉलम है।फ़ाइलदर्ज (से)चला (से)xyचौड़ाईऊँचाईनिपटान{n}से{n} B{n} KB{n} MBशीट बनाई जा रही है…यह शीट {width} × {height} पिक्सेल की होगी, जिसे कोई भी ब्राउज़र नहीं बना सकता। इसके बजाय हर दूसरा फ़्रेम रखें, या फ़्रेम को ZIP में सहेजें।शीट में हर खाने का आकार एक जैसा होना चाहिए, इसलिए यह फ़्रेम को वैसा ही लेती है जैसा दिखता है, न कि केवल उन पिक्सेल को जो वह फ़्रेम संग्रहीत करता है।आपका GIF कहीं नहीं गया। {total} फ़ाइलें लोड हुईं। {platform}किसी चीज़ ने {hosts} से संपर्क किया, और यह टूल ऐसा कभी नहीं करता। {platform}विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को कोई फ़ाइल नहीं मिली।विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को कोई फ़ाइल नहीं मिली।
क्या इससे काम बन गया?
क्या गड़बड़ हुई?
शुक्रिया — इससे मदद मिलती है।
सिर्फ़ आपका जवाब भेजा जाता है, वह भी तभी जब आप बटन दबाते हैं। आपकी फ़ाइल, उसका नाम या उससे जुड़ी कोई बात कभी नहीं।
# GIF फ़्रेम स्प्लिटर — हर फ़्रेम अलग PNG में
हर फ़्रेम अलग, अपनी PNG फ़ाइल में।
> किसी एनिमेटेड GIF को उसके फ़्रेम में बाँटिए और हर फ़्रेम को PNG में सहेजिए, मुफ़्त और पूरी तरह अपने ब्राउज़र में। ट्रांसपेरेंसी और टाइमिंग बनी रहती है। कुछ अपलोड नहीं होता और ऑफ़लाइन भी चलता है।
यह पेज एक इंटरैक्टिव टूल है जो पूरी तरह आपके ब्राउज़र में चलता है, https://abox.tools/hi/split-gif/ पर — आप इसे जो भी देते हैं, वह कहीं अपलोड नहीं होता। आगे वह सब कुछ है जो यह पेज इस टूल के बारे में शब्दों में कहता है; इसे इस्तेमाल करने के लिए यह पता खोलें।
## यह टूल GIF **कभी अपलोड नहीं करता**। यहाँ कोई सर्वर है ही नहीं।
GIF को पढ़ना, खोलना और बनाना, तीनों आपका अपना ब्राउज़र करता है, और हर PNG इसी डिवाइस की मेमोरी में तैयार होती है। मान लीजिए यहाँ कुछ भेजना भी चाहता, तो इस पेज के दूसरी तरफ़ ऐसा कोई सर्वर ही नहीं है जिसे एनिमेशन भेजा जा सके।
- ✗ कोई अपलोड नहीं
- ✗ कोई खाता नहीं
- ✓ ऑफ़लाइन चलता है
- ✓ ओपन सोर्स
- ✓ फ़ाइलें आपके डिवाइस पर ही रहती हैं
## GIF को फ़्रेम में कैसे बाँटें
1. **GIF चुनिए।** उसे चुनने वाले खाने में खींचकर छोड़ दीजिए या खुद ढूँढ़ लीजिए। ब्राउज़र उसे सीधे आपकी डिस्क से पढ़ता है, और पेज बता देता है कि उसे क्या मिला: साइज़, कितने फ़्रेम हैं, कितनी देर चलता है और कितनी बार दोहराता है।
2. **तय कीजिए कि हर PNG में क्या हो।** **फ़्रेम जैसा दिखता है** वही लगभग सबको चाहिए होता है, यानी एनिमेशन के उस पल की पूरी तस्वीर। **सिर्फ़ वे पिक्सल जो यह फ़्रेम सहेजता है** वह टुकड़ा है जो फ़ाइल असल में रखती है, अपने ही आकार और अपनी ही जगह पर। GIF इसी वजह से छोटा रहता है, और एनिमेशन दिखता ऐसा नहीं है।
3. **तय कीजिए कि ट्रांसपेरेंसी का क्या हो।** PNG उसे बचा लेता है, और ईमानदार डिफ़ॉल्ट यही है। अगर फ़्रेम ऐसी जगह जा रहे हैं जो ट्रांसपेरेंसी को नहीं मानती और उसे काला कर देगी, तो उसकी जगह कोई रंग भर दीजिए।
4. **अपने काम के फ़्रेम चुनिए।** डिफ़ॉल्ट में सारे। “हर दूसरा फ़्रेम रखिए” लंबी रिकॉर्डिंग को छाँटता है, और ग्रिड के टिक बॉक्स उससे ऊपर चलते हैं। नंबर कभी नहीं बदलते, इसलिए आपने उसके कितने भी पड़ोसी छोड़ दिए हों, फ़्रेम 42 फ़्रेम 42 ही रहेगा।
5. **इन्हें डाउनलोड कीजिए।** ग्रिड से एक-एक करके, या सब एक ही ZIP में, ताकि सैकड़ों बार के बजाय एक ही बार सेव का सवाल आए। ZIP के साथ एक `frames.txt` भी जा सकती है जिसमें लिखा होता है कि हर फ़्रेम कितनी देर टिका। PNG से भरा फ़ोल्डर अपने आप यही एक बात नहीं बता सकता।
## विस्तार से
[GIF को फ़्रेमों में कैसे बाँटें](https://abox.tools/hi/guides/split-a-gif-into-frames/): चलती GIF का हर फ़्रेम PNG में निकालिए: कुछ फ़्रेम तस्वीर का सिर्फ़ एक छोटा टुकड़ा क्यों होते हैं, पारदर्शिता का क्या होता है, और समय कैसे सँभालें ताकि सब वापस जोड़ा जा सके।
## बॉक्स में और भी टूल
- [GIF एनालाइज़र](https://abox.tools/hi/gif-analyzer/): फ़्रेम, देरी, पैलेट, और हर बाइट कहाँ गया।
- [तस्वीरों से वीडियो](https://abox.tools/hi/images-to-video/): तस्वीरों के एक फ़ोल्डर को वीडियो बना दीजिए।
- [वीडियो कटर](https://abox.tools/hi/trim-video/): चलते-चलते उन हिस्सों पर निशान लगाइए जो रखने लायक हैं। उन्हें एक ही वीडियो के रूप में वापस पाइए।
- [वीडियो क्रॉपर](https://abox.tools/hi/crop-video/): क्लिप में से उतना ही रखिए जितना काम का है।
## सवाल
### क्या मेरा GIF कहीं अपलोड होता है?
नहीं। फ़ाइल को आपका अपना ब्राउज़र आपके अपने हार्डवेयर पर पढ़ता, खोलता और बनाता है, और हर PNG यहीं मेमोरी में तैयार होती है। इस टूल का कोई सर्वर वाला हिस्सा है ही नहीं, और पेज की `Content-Security-Policy` में वे सारे पते लिखे हैं जिनसे यह बात कर सकता है, जिनमें से एक भी इस साइट का नहीं है। नेटवर्क काट दीजिए, यह फिर भी GIF बाँटता रहेगा।
### एक फ़्रेम तस्वीर के छोटे से टुकड़े जैसा क्यों दिखता है?
क्योंकि फ़ाइल में वही रखा है। GIF एक पहली तस्वीर है और उसके बाद पैबंद: हर अगला फ़्रेम सिर्फ़ वह चौकोर हिस्सा सहेजता है जो बदला, और स्क्रीन पर बाकी सब वही है जो पिछले फ़्रेम वहाँ छोड़ गए। इसलिए स्थिर दीवार के आगे बोलते हुए सिर की रिकॉर्डिंग में हर फ़्रेम पर एक चेहरा सहेजा जाता है, पूरी तस्वीर नहीं, और यही अकेली वजह है कि यह फ़ॉर्मैट बहुत भारी नहीं होता। \
\
आपको यह इसलिए दिख रहा है क्योंकि “सिर्फ़ वे पिक्सल जो यह फ़्रेम सहेजता है” चुना हुआ है। इसे “फ़्रेम जैसा दिखता है” पर कर दीजिए, फिर हर PNG उस पल की पूरी तस्वीर होगी।
### क्या ट्रांसपेरेंसी बची रहती है?
हाँ। GIF की ट्रांसपेरेंसी एक ही बिट की होती है, यानी पिक्सल या तो रंगा है या गायब है, बीच में कुछ नहीं। PNG ठीक यही सहेजता है, इसलिए फ़्रेम अपने पारदर्शी हिस्सों के साथ ही बाहर आते हैं। अगर आपको ठोस बैकग्राउंड चाहिए तो “पारदर्शी हिस्से” को किसी रंग से भरने पर लगा दीजिए। वह रंग PNG में लिख दिया जाता है और बाद में हटाया नहीं जा सकता।
### फ़्रेम की देरी वे नहीं है जो मैंने सोची थी, ऐसा क्यों?
GIF हर देरी को सेकंड के सौवें हिस्से में रखता है, और नब्बे के दशक से ब्राउज़र दो सौवें से कम किसी भी मान को उठाकर दसवाँ हिस्सा कर देते हैं। यह नियम उस ज़माने के घूमते हुए ग्लोब के लिए लिखा गया था और कभी हटाया नहीं गया। इसलिए जिस फ़्रेम की फ़ाइल में 0.01 सेकंड लिखा है, वह हर जगह 0.10 सेकंड पर चलता है। यह टूल वही देरी दिखाता है जो सचमुच चलती है, और दोनों अलग हों तो फ़ाइल में लिखा मान भी बगल में बता देता है।
### क्या फ़्रेम दोबारा जोड़े जा सकते हैं?
हाँ, इसी साइट के [GIF मेकर](https://abox.tools/hi/gif-maker/) से, या किसी भी ऐसी चीज़ से जो तस्वीरों का फ़ोल्डर लेती हो। ZIP में रखी `frames.txt` इसी के लिए है: एनिमेशन बाँटने पर टाइमिंग चली जाती है, क्योंकि PNG के पास यह लिखने की जगह ही नहीं होती कि वह कितनी देर टिका था, इसलिए यह सूची हर फ़्रेम की देरी और जगह साथ लेकर बाहर आती है।
### फ़्रेम किन फ़ॉर्मैट में सहेजे जा सकते हैं?
PNG में, और जानबूझकर सिर्फ़ PNG में। GIF के एक फ़्रेम में ज़्यादा से ज़्यादा 256 रंग और एक बिट ट्रांसपेरेंसी होती है; PNG इसे बिलकुल वैसा ही और बिना नुकसान के सहेजता है, जबकि JPEG ट्रांसपेरेंसी फेंक देता, ऐसे रंग गढ़ता जो फ़्रेम में कभी थे ही नहीं, और सपाट चित्रकारी से आम तौर पर *बड़ी* फ़ाइल बनाता। अगर JPEG चाहिए तो PNG को बाद में [इमेज रिसाइज़र](https://abox.tools/hi/resize-image/) से बदल लीजिए।
### यह कितने फ़्रेम तक पढ़ सकता है?
कोई तय सीमा नहीं है। असली छत आपके डिवाइस की मेमोरी है: पढ़े जाते समय GIF फैलकर लगभग एक बाइट प्रति पिक्सल प्रति फ़्रेम हो जाता है, इसलिए छोटी सी फ़ाइल भी बहुत बड़ी मेमोरी बन सकती है। ऐसे में यह पेज टैब को मरने देने के बजाय पढ़ना रोक देता है। ऐसा हो तो वह बता देता है और जितने फ़्रेम मिल गए थे, वे लौटा देता है।
### क्या यह खराब GIF भी खोल लेता है?
आम तौर पर हाँ। अधूरे डाउनलोड, गायब अंत-चिह्न और बीच में ही रुक जाने वाला आखिरी फ़्रेम, ये सब आम बातें हैं, और जो रीडर इन्हें मना कर दे वह ठीक उन्हीं फ़ाइलों के काम नहीं आता जिन्हें लोग सबसे ज़्यादा खोलकर देखना चाहते हैं। जितने फ़्रेम पूरे हैं, वे सब वापस आते हैं, साथ में यह भी कि क्या गड़बड़ थी। सीधे मना सिर्फ़ उसी फ़ाइल को किया जाता है जो GIF है ही नहीं।
### क्या यह मुफ़्त है, और क्या इसके लिए खाता बनाना पड़ेगा?
यह मुफ़्त है, और यहाँ न कोई खाता है, न साइन-इन, न ट्रायल। फ़्रेम पर वॉटरमार्क भी नहीं आता। साइट पर विज्ञापन हैं और खर्च वही उठाते हैं, लेकिन विज्ञापनों को आपकी फ़ाइलों के बारे में कुछ नहीं दिया जाता।
### क्या यह ऑफ़लाइन चलता है?
हाँ। पेज एक बार लोड कर लीजिए, फिर इंटरनेट काट दीजिए, यह चलता रहेगा। कुछ अपलोड नहीं हो रहा, यह साबित करने का सबसे आसान तरीका भी यही है। जो टूल आपका एनिमेशन प्रोसेस करने के लिए कहीं भेजता, वह प्लग निकालते ही रुक जाता।
## प्राइवेसी का यह दावा कैसे जाँचा जा सकता है
- **आपके GIF के पास बाहर जाने का रास्ता ही नहीं है।** Content-Security-Policy में वे सारे पते लिखे हैं जिनसे यह पेज बात कर सकता है, और उनमें से एक भी इस साइट का नहीं है। यहाँ ऐसा कोई ठिकाना है ही नहीं जहाँ आपकी फ़ाइलें इकट्ठी की जा सकें, और होता भी तो कोड में ऐसा कुछ नहीं है जो उन्हें वहाँ भेजे। पहले यहाँ `connect-src 'none'` लिखा था, जिसमें कोई अपवाद नहीं था। विज्ञापन की कीमत यही थी, और यह बता देना भी सौदे का हिस्सा है।
- **GIF पढ़ने वाला हिस्सा इस रिपॉज़िटरी की दो फ़ाइलें हैं।** ब्राउज़र GIF चला तो देता है, पर उसके हिस्से आपको नहीं सौंपता, इसलिए फ़ॉर्मैट यहीं पढ़ा जाता है। `src/gif.js` कंटेनर और LZW डीकंप्रेसर है, और `src/compose.js` वे नियम हैं जो तय करते हैं कि पिछले फ़्रेम नीचे बिछ जाने के बाद यह फ़्रेम कैसा दिखेगा। फ़ाइल खोलने के लिए कुछ मँगाया नहीं जाता, और पहली बार इस्तेमाल पर कोई इंजन भी नहीं उतरता।
- **Google क्या लोड करता है, और उसे क्या नहीं दिया जाता।** विज्ञापन और माप वाली स्क्रिप्ट Google से आती हैं। इनमें से किसी को भी आपके एनिमेशन के बारे में कुछ नहीं सौंपा जाता, न फ़ाइल, न कोई फ़्रेम, न नाम, न साइज़, न गिनती। तस्वीर पढ़ने, खोलने, बनाने या लिखने वाली हर पंक्ति इसी ऑरिजिन से आती है और रिपॉज़िटरी में मौजूद है।
- **दान का बटन क्या लोड करता है, और उसे क्या नहीं दिया जाता।** हेडर वाला “Buy me a coffee” बटन cdnjs.buymeacoffee.com की एक स्क्रिप्ट बनाती है और अक्षर Google Fonts से आते हैं। वह एक लिंक से ज़्यादा कुछ नहीं है। न वह आपकी विज़िट की खबर देता है, न उसे आपके या आपकी फ़ाइलों के बारे में कुछ मिलता है। जब तक आप क्लिक न करें कुछ नहीं होता, और क्लिक करने पर जो खुलेगा वह किसी और की साइट है।
- **यह ऑफ़लाइन भी चलता है।** नेटवर्क काट दीजिए, इस पेज का हर हिस्सा काम करता रहेगा। सबसे आसान सबूत यही है। जो टूल आपका एनिमेशन बाँटने के लिए कहीं भेजता, वह प्लग निकालते ही रुक जाता।
**खुद जाँच लीजिए।** ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा `dist` ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं: https://github.com/A-Box-of-Tools/website
सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए `config/site.toml`, फ़्रेम खोलने वाले रीडर के लिए `src/gif.js`, और उन्हें एक के ऊपर एक रखने के नियमों के लिए `src/compose.js`। दोनों में से किसी में भी ऐसी एक पंक्ति नहीं है जो नेटवर्क तक पहुँच सके।
GIF को फ़्रेम में कैसे बाँटें
GIF चुनिए। उसे चुनने वाले खाने में खींचकर छोड़ दीजिए या खुद ढूँढ़ लीजिए। ब्राउज़र उसे सीधे आपकी डिस्क से पढ़ता है, और पेज बता देता है कि उसे क्या मिला: साइज़, कितने फ़्रेम हैं, कितनी देर चलता है और कितनी बार दोहराता है।
तय कीजिए कि हर PNG में क्या हो।फ़्रेम जैसा दिखता है वही लगभग सबको चाहिए होता है, यानी एनिमेशन के उस पल की पूरी तस्वीर। सिर्फ़ वे पिक्सल जो यह फ़्रेम सहेजता है वह टुकड़ा है जो फ़ाइल असल में रखती है, अपने ही आकार और अपनी ही जगह पर। GIF इसी वजह से छोटा रहता है, और एनिमेशन दिखता ऐसा नहीं है।
तय कीजिए कि ट्रांसपेरेंसी का क्या हो। PNG उसे बचा लेता है, और ईमानदार डिफ़ॉल्ट यही है। अगर फ़्रेम ऐसी जगह जा रहे हैं जो ट्रांसपेरेंसी को नहीं मानती और उसे काला कर देगी, तो उसकी जगह कोई रंग भर दीजिए।
अपने काम के फ़्रेम चुनिए। डिफ़ॉल्ट में सारे। “हर दूसरा फ़्रेम रखिए” लंबी रिकॉर्डिंग को छाँटता है, और ग्रिड के टिक बॉक्स उससे ऊपर चलते हैं। नंबर कभी नहीं बदलते, इसलिए आपने उसके कितने भी पड़ोसी छोड़ दिए हों, फ़्रेम 42 फ़्रेम 42 ही रहेगा।
इन्हें डाउनलोड कीजिए। ग्रिड से एक-एक करके, या सब एक ही ZIP में, ताकि सैकड़ों बार के बजाय एक ही बार सेव का सवाल आए। ZIP के साथ एक frames.txt भी जा सकती है जिसमें लिखा होता है कि हर फ़्रेम कितनी देर टिका। PNG से भरा फ़ोल्डर अपने आप यही एक बात नहीं बता सकता।
विस्तार से
GIF को फ़्रेमों में कैसे बाँटेंचलती GIF का हर फ़्रेम PNG में निकालिए: कुछ फ़्रेम तस्वीर का सिर्फ़ एक छोटा टुकड़ा क्यों होते हैं, पारदर्शिता का क्या होता है, और समय कैसे सँभालें ताकि सब वापस जोड़ा जा सके।
नहीं। फ़ाइल को आपका अपना ब्राउज़र आपके अपने हार्डवेयर पर पढ़ता, खोलता और बनाता है, और हर PNG यहीं मेमोरी में तैयार होती है। इस टूल का कोई सर्वर वाला हिस्सा है ही नहीं, और पेज की Content-Security-Policy में वे सारे पते लिखे हैं जिनसे यह बात कर सकता है, जिनमें से एक भी इस साइट का नहीं है। नेटवर्क काट दीजिए, यह फिर भी GIF बाँटता रहेगा।
एक फ़्रेम तस्वीर के छोटे से टुकड़े जैसा क्यों दिखता है?
क्योंकि फ़ाइल में वही रखा है। GIF एक पहली तस्वीर है और उसके बाद पैबंद: हर अगला फ़्रेम सिर्फ़ वह चौकोर हिस्सा सहेजता है जो बदला, और स्क्रीन पर बाकी सब वही है जो पिछले फ़्रेम वहाँ छोड़ गए। इसलिए स्थिर दीवार के आगे बोलते हुए सिर की रिकॉर्डिंग में हर फ़्रेम पर एक चेहरा सहेजा जाता है, पूरी तस्वीर नहीं, और यही अकेली वजह है कि यह फ़ॉर्मैट बहुत भारी नहीं होता।
आपको यह इसलिए दिख रहा है क्योंकि “सिर्फ़ वे पिक्सल जो यह फ़्रेम सहेजता है” चुना हुआ है। इसे “फ़्रेम जैसा दिखता है” पर कर दीजिए, फिर हर PNG उस पल की पूरी तस्वीर होगी।
क्या ट्रांसपेरेंसी बची रहती है?
हाँ। GIF की ट्रांसपेरेंसी एक ही बिट की होती है, यानी पिक्सल या तो रंगा है या गायब है, बीच में कुछ नहीं। PNG ठीक यही सहेजता है, इसलिए फ़्रेम अपने पारदर्शी हिस्सों के साथ ही बाहर आते हैं। अगर आपको ठोस बैकग्राउंड चाहिए तो “पारदर्शी हिस्से” को किसी रंग से भरने पर लगा दीजिए। वह रंग PNG में लिख दिया जाता है और बाद में हटाया नहीं जा सकता।
फ़्रेम की देरी वे नहीं है जो मैंने सोची थी, ऐसा क्यों?
GIF हर देरी को सेकंड के सौवें हिस्से में रखता है, और नब्बे के दशक से ब्राउज़र दो सौवें से कम किसी भी मान को उठाकर दसवाँ हिस्सा कर देते हैं। यह नियम उस ज़माने के घूमते हुए ग्लोब के लिए लिखा गया था और कभी हटाया नहीं गया। इसलिए जिस फ़्रेम की फ़ाइल में 0.01 सेकंड लिखा है, वह हर जगह 0.10 सेकंड पर चलता है। यह टूल वही देरी दिखाता है जो सचमुच चलती है, और दोनों अलग हों तो फ़ाइल में लिखा मान भी बगल में बता देता है।
क्या फ़्रेम दोबारा जोड़े जा सकते हैं?
हाँ, इसी साइट के GIF मेकर से, या किसी भी ऐसी चीज़ से जो तस्वीरों का फ़ोल्डर लेती हो। ZIP में रखी frames.txt इसी के लिए है: एनिमेशन बाँटने पर टाइमिंग चली जाती है, क्योंकि PNG के पास यह लिखने की जगह ही नहीं होती कि वह कितनी देर टिका था, इसलिए यह सूची हर फ़्रेम की देरी और जगह साथ लेकर बाहर आती है।
फ़्रेम किन फ़ॉर्मैट में सहेजे जा सकते हैं?
PNG में, और जानबूझकर सिर्फ़ PNG में। GIF के एक फ़्रेम में ज़्यादा से ज़्यादा 256 रंग और एक बिट ट्रांसपेरेंसी होती है; PNG इसे बिलकुल वैसा ही और बिना नुकसान के सहेजता है, जबकि JPEG ट्रांसपेरेंसी फेंक देता, ऐसे रंग गढ़ता जो फ़्रेम में कभी थे ही नहीं, और सपाट चित्रकारी से आम तौर पर बड़ी फ़ाइल बनाता। अगर JPEG चाहिए तो PNG को बाद में इमेज रिसाइज़र से बदल लीजिए।
यह कितने फ़्रेम तक पढ़ सकता है?
कोई तय सीमा नहीं है। असली छत आपके डिवाइस की मेमोरी है: पढ़े जाते समय GIF फैलकर लगभग एक बाइट प्रति पिक्सल प्रति फ़्रेम हो जाता है, इसलिए छोटी सी फ़ाइल भी बहुत बड़ी मेमोरी बन सकती है। ऐसे में यह पेज टैब को मरने देने के बजाय पढ़ना रोक देता है। ऐसा हो तो वह बता देता है और जितने फ़्रेम मिल गए थे, वे लौटा देता है।
क्या यह खराब GIF भी खोल लेता है?
आम तौर पर हाँ। अधूरे डाउनलोड, गायब अंत-चिह्न और बीच में ही रुक जाने वाला आखिरी फ़्रेम, ये सब आम बातें हैं, और जो रीडर इन्हें मना कर दे वह ठीक उन्हीं फ़ाइलों के काम नहीं आता जिन्हें लोग सबसे ज़्यादा खोलकर देखना चाहते हैं। जितने फ़्रेम पूरे हैं, वे सब वापस आते हैं, साथ में यह भी कि क्या गड़बड़ थी। सीधे मना सिर्फ़ उसी फ़ाइल को किया जाता है जो GIF है ही नहीं।
क्या यह मुफ़्त है, और क्या इसके लिए खाता बनाना पड़ेगा?
यह मुफ़्त है, और यहाँ न कोई खाता है, न साइन-इन, न ट्रायल। फ़्रेम पर वॉटरमार्क भी नहीं आता। साइट पर विज्ञापन हैं और खर्च वही उठाते हैं, लेकिन विज्ञापनों को आपकी फ़ाइलों के बारे में कुछ नहीं दिया जाता।
क्या यह ऑफ़लाइन चलता है?
हाँ। पेज एक बार लोड कर लीजिए, फिर इंटरनेट काट दीजिए, यह चलता रहेगा। कुछ अपलोड नहीं हो रहा, यह साबित करने का सबसे आसान तरीका भी यही है। जो टूल आपका एनिमेशन प्रोसेस करने के लिए कहीं भेजता, वह प्लग निकालते ही रुक जाता।