সবচেয়ে ছোট ট্রান্সপারেন্ট GIF হলো 43 বাইটের।
পুরো ফাইলটা এটুকুই। যেকোনো বাইট বেছে নিয়ে দেখুন সেটি কী করে, তারপর ফাইলটি কপি করুন, ডাউনলোড করুন, হটলিঙ্ক করুন, অথবা নিজের কোড থেকে সার্ভ করুন।

প্রতিটি বাইট কী করে
একটি GIF হলো পরপর সাজানো কয়েকটি ব্লক। এটিতে সাতটি ব্লক আছে, আর এই পেজের প্রতিটি রং তাদের কোনো একটির। পড়ার জন্য একটি বাইট বা ব্লক বেছে নিন। সংখ্যাগুলো little-endian ভাবে স্টোর হয়: লো বাইট আগে আসে, তাই 01 00 মানে 1।
| বাইট | ফিল্ড | অর্থ |
|---|---|---|
| হেডার ডিকোডারকে জানায় যে এটি একটি GIF এবং ফরম্যাটের কোন ভার্সন আশা করতে হবে। | ||
| 47 49 46 | সিগনেচার | ASCII অক্ষর “GIF”। প্রতিটি GIF ফাইল এগুলো দিয়েই শুরু হয়। |
| 38 39 61 | ভার্সন | “89a”। ট্রান্সপারেন্সির জন্য 89a দরকার; 87a-তে গ্রাফিক কন্ট্রোল এক্সটেনশন নেই। |
| লজিক্যাল স্ক্রিন ডেসক্রিপ্টর ক্যানভাসের সাইজ এবং তার কালার টেবিল কীভাবে সেট করা আছে। | ||
| 01 00 | ক্যানভাসের প্রস্থ | ১ px। |
| 01 00 | ক্যানভাসের উচ্চতা | ১ px। |
| 80 | প্যাকড ফ্ল্যাগ | একটি বাইটে চারটি সেটিং গুঁজে রাখা। সবচেয়ে উপরের বিট জানায় যে এরপর গ্লোবাল কালার টেবিল আছে; শেষ তিনটি বিট তার সাইজ দেয়। |
| 00 | ব্যাকগ্রাউন্ড কালার ইনডেক্স | প্যালেট এন্ট্রি ০। ব্রাউজার এটি উপেক্ষা করে এবং ইমেজের পেছনে যা আছে তা-ই দেখায়। |
| 00 | পিক্সেল অ্যাসপেক্ট রেশিও | 0 মানে বর্গাকার পিক্সেল, কোনো সংশোধন নেই। |
| গ্লোবাল কালার টেবিল প্যালেট। পিক্সেলে রং নয়, এই তালিকার একটি ইনডেক্স স্টোর থাকে। | ||
| FF FF FF | প্যালেট এন্ট্রি | লাল, সবুজ ও নীল, প্রতিটি এক বাইট করে: #ffffff। দুই এন্ট্রির টেবিলই একটি GIF-এর সবচেয়ে ছোট সম্ভাব্য টেবিল। |
| 00 00 00 | প্যালেট এন্ট্রি | লাল, সবুজ ও নীল, প্রতিটি এক বাইট করে: #000000। দুই এন্ট্রির টেবিলই একটি GIF-এর সবচেয়ে ছোট সম্ভাব্য টেবিল। |
| গ্রাফিক কন্ট্রোল এক্সটেনশন GIF89a-তে যোগ হওয়া ঐচ্ছিক ব্লক। এখানে এটি প্যালেট এন্ট্রি 0-কে ট্রান্সপারেন্ট করে। | ||
| 21 | এক্সটেনশন ইন্ট্রোডিউসার | 0x21 (“!”) জানায় যে একটি এক্সটেনশন ব্লক আসছে। |
| F9 | গ্রাফিক কন্ট্রোল লেবেল | 0xF9 জানায় যে এই এক্সটেনশনটি একটি গ্রাফিক কন্ট্রোল এক্সটেনশন। |
| 04 | ব্লক সাইজ | এরপর ৪ বাইট সেটিং আছে। |
| 01 | প্যাকড ফ্ল্যাগ | সবচেয়ে নিচের বিটটি ট্রান্সপারেন্সি ফ্ল্যাগ। এটি অন আছে, তাই নিচের ট্রান্সপারেন্ট ইনডেক্স ব্যবহার হয়। |
| 00 00 | ডিলে | এক সেকেন্ডের ০ শতাংশ। এটি শুধু অ্যানিমেশনের ক্ষেত্রে গুরুত্বপূর্ণ। |
| 00 | ট্রান্সপারেন্ট কালার ইনডেক্স | প্যালেট এন্ট্রি ০ পুরোপুরি ট্রান্সপারেন্ট হিসেবে ড্র হয়। |
| 00 | ব্লক টার্মিনেটর | শূন্য দৈর্ঘ্যের একটি সাব-ব্লক, যা ব্লকটি বন্ধ করে। |
| ইমেজ ডেসক্রিপ্টর ইমেজটি ক্যানভাসের কোথায় বসে এবং সেটি কত বড়। | ||
| 2C | ইমেজ সেপারেটর | 0x2C (“,”) একটি ইমেজ শুরু করে। |
| 00 00 | বাম | ইমেজটি ক্যানভাসের বাম প্রান্ত থেকে ০ px দূরে শুরু হয়। |
| 00 00 | উপর | ইমেজটি ক্যানভাসের উপরের প্রান্ত থেকে ০ px দূরে শুরু হয়। |
| 01 00 | ইমেজের প্রস্থ | ১ px। |
| 01 00 | ইমেজের উচ্চতা | ১ px। |
| 00 | প্যাকড ফ্ল্যাগ | লোকাল কালার টেবিল নেই, ইন্টারলেসড নয়। ইমেজটি গ্লোবাল প্যালেট ব্যবহার করে। |
| ইমেজ ডেটা পিক্সেলগুলো, LZW দিয়ে কম্প্রেস করা এবং সর্বোচ্চ 255 বাইটের সাব-ব্লকে ভাগ করা। | ||
| 02 | LZW মিনিমাম কোড সাইজ | ২, তাই কম্প্রেসড কোডগুলো শুরুতে ৩ বিট চওড়া। |
| 02 | সাব-ব্লক সাইজ | এরপর ২ বাইট কম্প্রেসড ডেটা আছে। |
| 44 01 | কম্প্রেসড পিক্সেল | সবচেয়ে নিচের বিট থেকে উপরের দিকে প্যাক করা LZW কোড। এগুলো কীভাবে ডিকোড হয়, নিচে দেখুন। |
| 00 | ব্লক টার্মিনেটর | শূন্য দৈর্ঘ্যের একটি সাব-ব্লক, যা ব্লকটি বন্ধ করে। |
| ট্রেলার একটি বাইট, যা ফাইলের শেষ চিহ্নিত করে। | ||
| 3B | ট্রেলার | 0x3B (“;”) ফাইল শেষ করে। |
প্যাকড বাইটের ভেতরে
তিনটি বাইটের প্রতিটিতে কয়েকটি ছোট সেটিং রাখা আছে। বিট 7 সবচেয়ে বাঁ দিকে।
0x800x010x00দুটি বাইটে কীভাবে একটি পিক্সেল থাকে
মিনিমাম কোড সাইজ 2 হলে ডিকোডার 3-বিট কোড পড়ে। কোড 4 টেবিল ক্লিয়ার করে, কোড 5 ইমেজ শেষ করে, আর কোড 0 থেকে 3 হলো প্যালেট এন্ট্রি। বাইট 44 01 সবচেয়ে নিচের বিট থেকে উপরের দিকে পড়া হয়:
0x44 010001000x01 00000001
- 001100 = 4ক্লিয়ার: নতুন টেবিল দিয়ে শুরু
- 000000 = 0পিক্সেল: প্যালেট এন্ট্রি ০
- 101101 = 5ইমেজের শেষ
- 0000000 অব্যবহৃত প্যাডিং বিট
বড় ইমেজেও একই কৌশল কাজ করে: প্রতিটি নতুন কোড আগেরটির চেয়ে এক পিক্সেল লম্বা একটি রান বোঝায়, তাই 1000×1000 ট্রান্সপারেন্ট GIF মাত্র ১,৭৪৩ বাইটের হয়।
এটি কি আরও ছোট হতে পারে?
হ্যাঁ, যদি এমন অংশ বাদ দেন যেগুলো না থাকলেও ডিকোডার মানিয়ে নেয়। আমরা প্রতিটি ভ্যারিয়েন্ট তিনটি ব্রাউজার ইঞ্জিন ও Pillow-এ চালিয়ে দেখেছি এবং তারা কী ড্র করেছে তা লিখে রেখেছি।
| সাইজ | ভ্যারিয়েন্ট | Chromium | Firefox | WebKit | Pillow |
|---|---|---|---|---|---|
| ৪৩ | এই পেজের স্ট্যান্ডার্ড ফাইল। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট |
| ৪২ | ট্রেলার বাইট নেই। ডিকোডার এমনিতেই ডেটা শেষ হলে থেমে যায়। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট |
| ৩৭ | কোনো প্যালেটই নেই। তবুও বৈধ: স্পেসিফিকেশন ডিকোডারকে নিজের প্যালেট ব্যবহার করতে দেয়, আর ইনডেক্স 0 এমনিতেই ট্রান্সপারেন্ট। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট |
| ৩৬ | প্যালেটও নেই, ট্রেলারও নেই। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট |
| ৩৫ | ট্রান্সপারেন্সি ব্লক নেই: পিক্সেলটি প্যালেট কালার 0, অর্থাৎ সাদা রঙে ড্র হয়। | সাদা | সাদা | সাদা | সাদা |
| ৩৫ | 1987 সালের ফরম্যাট। এতে কোনো রংকে ট্রান্সপারেন্ট চিহ্নিত করার উপায় নেই। | সাদা | সাদা | সাদা | সাদা |
| ৩৪ | ট্রান্সপারেন্সি ব্লক আছে, কিন্তু কম্প্রেসড পিক্সেল নেই। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | এরর |
| ৩৩ | একই জিনিস, ট্রেলার ছাড়া। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | এরর |
| ২৯ | প্যালেটও নেই, ট্রান্সপারেন্সিও নেই। প্রতিটি ইঞ্জিন নিজের মতো রং বেছে নেয়। | কালো | সাদা | ট্রান্সপারেন্ট | কালো |
| ২৬ | এমন একটি ইমেজ, যাতে কোনো কম্প্রেসড ডেটাই নেই। | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | ট্রান্সপারেন্ট | এরর |
| ১৪ | শুধু হেডার, ক্যানভাস সাইজ আর ট্রেলার। এতে কোনো ইমেজ নেই। | ট্রান্সপারেন্ট | এরর | ট্রান্সপারেন্ট | এরর |
সব জায়গায় কাজ করতেই হবে এমন হলে 43 বাইটের ফাইল ব্যবহার করুন। 37 বাইটের ফাইলও বৈধ GIF এবং আমাদের পরীক্ষিত প্রতিটি ইঞ্জিনে ট্রান্সপারেন্ট দেখিয়েছে। এর চেয়ে ছোট হলে আপনি ডিকোডারের উদারতার ওপর নির্ভর করছেন, আর 29 বাইটের ফাইলটি দেখায় ইঞ্জিনগুলো কীভাবে একে অপরের সঙ্গে মেলে না।
২৩ সেপ্টেম্বর, ২০২৬ তারিখে Chromium 153.0.8010.12, Firefox 155.0, WebKit 26.6, Pillow 12.2.0 দিয়ে যাচাই করা।
যেকোনো সাইজে বানান
ট্রান্সপারেন্ট বা একটি নিরেট রঙের, 1×1 থেকে 65535×65535 পর্যন্ত। এটি আপনার ব্রাউজারেই তৈরি হয়; কিছুই আপলোড হয় না।
হটলিঙ্ক করুন
যেকোনো সাইট, ইমেইল বা অ্যাপ থেকে সরাসরি এই ফাইলগুলোতে লিঙ্ক করুন। এগুলো Cloudflare-এর edge থেকে দীর্ঘ ক্যাশ মেয়াদ সহ সার্ভ হয়, আর CORS সবার জন্য খোলা।
- 43 বাইটের ফাইল
https://emptygif.com/1x1.gif - যেকোনো সাইজ, ট্রান্সপারেন্ট
https://emptygif.com/px/300x250.gif - যেকোনো সাইজ, নিরেট রং
https://emptygif.com/px/300x250/ff5a1f.gif - JSON API: সাইজ, base64 ও data URI
https://emptygif.com/api/gif?w=300&h=250 - সব স্নিপেট JSON হিসেবে
https://emptygif.com/snippets.json - AI এজেন্টদের জন্য সারসংক্ষেপ
https://emptygif.com/llms.txt
রেসপন্স হেডার
HTTP/2 200
content-type: image/gif
content-length: 43
cache-control: public, max-age=31536000, immutable
access-control-allow-origin: *
cross-origin-resource-policy: cross-origin
timing-allow-origin: *উদাহরণ
<img src="https://emptygif.com/1x1.gif" width="1" height="1" alt="">
জেনারেট করা সাইজ প্রতি দিকে 4096 px পর্যন্ত। আপনার ট্রাফিক বেশি হলে দয়া করে ফাইলটি ডাউনলোড করে নিজে হোস্ট করুন।
আপনার স্ট্যাক থেকে সার্ভ করুন
চালানোর জন্য তৈরি ১৭৩টি স্নিপেট। আপনারটি বেছে নিন: প্রতিটি আপনার বেছে নেওয়া পাথে image/gif রেসপন্স দেয়। ওপরে সাইজ বা রং বদলে থাকলে স্নিপেটগুলো সেই GIF-ই ব্যবহার করে।
JavaScript & TypeScript
Edge & serverless
- Cloudflare Workers
- Cloudflare Workers (Rust, workers-rs)
- Cloudflare Pages Functions
- Deno Deploy (deno serve)
- Vercel Functions
- Netlify Functions
- Netlify Edge Functions
- AWS Lambda (Node.js)
- AWS Lambda (Python)
- AWS Lambda (Go)
- AWS Lambda (Rust, lambda_http)
- AWS Lambda@Edge (CloudFront)
- Google Cloud Run functions (Node.js)
- Google Cloud Run functions (Python)
- Firebase Cloud Functions + Hosting
- Azure Functions (Node.js v4 model)
- Fastly Compute (JavaScript)
Python
JVM
PHP
Elixir, Erlang & Gleam
Functional languages
C, C++ & systems languages
Swift, Dart & other languages
Web servers & proxies
Command line & one-liners
Express JavaScript
import express from 'express';
const GIF = Buffer.from('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'base64');
const app = express();
app.get('/pixel.gif', (req, res) => {
res.set('Cache-Control', 'no-store');
res.type('gif').send(GIF);
});
app.listen(8080);
আমরা এই স্নিপেট চালিয়েছি এবং এটি যে বাইটগুলো ফেরত দিয়েছে তা মিলিয়ে দেখেছি। পেজ খুলুন
এটি কী কাজে লাগে
- ট্র্যাকিং পিক্সেল ও বিকন: সার্ভার রিকোয়েস্টটি লগ করে এবং সবচেয়ে ছোট বৈধ ইমেজ দিয়ে উত্তর দেয়।
- lazy-load হওয়া ইমেজের প্লেসহোল্ডার, যাতে আসল সোর্স আসার আগেও
imgট্যাগ বৈধ থাকে। - HTML ইমেইলে নির্দিষ্ট সাইজের স্পেসার, যেখানে CSS সাপোর্ট অসম্পূর্ণ।
- টেস্ট ও মক, যেগুলোর একটি আসল ইমেজ দরকার, কিন্তু সঙ্গে ইমেজ ফাইল রাখতে চায় না।
ট্র্যাকিং পিক্সেল যতটা মনে হয় ততটা নির্ভরযোগ্য নয়
Mail Privacy Protection চালু থাকলে Apple Mail প্রক্সির মাধ্যমে রিমোট ইমেজ আগেই লোড করে রাখে, তাই কোনো “open” হয়তো আদৌ কোনো মানুষ করেননি। Gmail-ও নিজের প্রক্সি দিয়ে ইমেজ ফেচ করে ক্যাশ করে। অনেক ক্লায়েন্ট ডিফল্টভাবে রিমোট ইমেজ ব্লক করে। পেজ অ্যানালিটিক্সের জন্য ইমেজের বদলে প্রায়ই navigator.sendBeacon() বা একটি 204 No Content রেসপন্স বেশি উপযুক্ত।
প্রশ্ন
- একটি পিক্সেল থাকা সত্ত্বেও একে empty বলা হয় কেন?
- একটি GIF-এ অন্তত একটি পিক্সেল থাকতেই হয়। এটি 1×1 এবং এর একমাত্র রংটি ট্রান্সপারেন্ট চিহ্নিত, তাই কিছুই দেখা যায় না।
- 43 বাইটের ফাইলটি কি বৈধ?
- হ্যাঁ। এটি GIF89a স্পেসিফিকেশন হুবহু মেনে চলে, এবং ওপরের টেবিলের প্রতিটি ইঞ্জিন এটিকে ট্রান্সপারেন্ট হিসেবে ড্র করে।
- PNG বা WebP নয়, GIF কেন?
- এটি সবচেয়ে ছোট ট্রান্সপারেন্ট PNG-এর চেয়েও ছোট, এবং গত 35 বছরের প্রতিটি ব্রাউজার, ইমেইল ক্লায়েন্ট ও ইমেজ লাইব্রেরি এটি পড়তে পারে।
- data URI ব্যবহার করব, নাকি ফাইল?
- data URI একটি রিকোয়েস্ট বাঁচায় এবং প্লেসহোল্ডার ও CSS-এর জন্য উপযুক্ত। রিকোয়েস্টটাই যখন আসল উদ্দেশ্য, যেমন ট্র্যাকিং পিক্সেলে, তখন একটি ফাইল বা endpoint দরকার।
- কোন Content-Type পাঠাব?
image/gif। প্রতিটি রিকোয়েস্ট আপনার সার্ভারে পৌঁছানো জরুরি হলেCache-Control: no-storeযোগ করুন।