کوچکترین 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 | فلگهای فشرده | بدون جدول رنگ محلی، بدون interlace. تصویر از پالت سراسری استفاده میکند. |
| داده تصویر پیکسلها، فشردهشده با 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 بیتهای پرکننده بلااستفاده
تصاویر بزرگتر هم از همین ترفند استفاده میکنند: هر کد جدید نماینده رشتهای است که یک پیکسل از قبلی بلندتر است، پس یک GIF شفاف 1000×1000 فقط ۱٬۷۴۳ بایت جا میگیرد.
کوچکتر هم میشود؟
بله، اگر بخشهایی را حذف کنید که دیکودرها نبودشان را تحمل میکنند. هر نسخه را به سه موتور مرورگر و به 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 با زمان کش طولانی سرو میشوند و 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 - خلاصه برای عاملهای هوش مصنوعی
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);
این قطعهکد را اجرا کردیم و بایتهایی را که برگرداند مقایسه کردیم. باز کردن صفحه
کاربردها
- پیکسلهای ردیابی و beaconها: سرور درخواست را لاگ میکند و با کوچکترین تصویر معتبر پاسخ میدهد.
- جانگهدار برای تصاویر lazy-load، تا تگ
imgپیش از رسیدن منبع واقعی معتبر باشد. - فاصلهگذارهای با اندازه ثابت در ایمیل HTML، جایی که پشتیبانی از CSS ناقص است.
- تستها و mockهایی که به یک تصویر واقعی نیاز دارند بدون اینکه فایل تصویری همراهشان باشد.
پیکسلهای ردیابی کمتر از آنچه به نظر میرسند قابل اعتمادند
وقتی Mail Privacy Protection روشن است، Apple Mail تصاویر راه دور را از طریق یک پراکسی پیشبارگذاری میکند، پس ممکن است یک «باز شدن» اصلاً کار یک انسان نبوده باشد. Gmail هم تصاویر را از طریق پراکسی خودش میگیرد و کش میکند. بسیاری از کلاینتها بهطور پیشفرض تصاویر راه دور را مسدود میکنند. برای آنالیتیکس صفحه، navigator.sendBeacon() یا یک پاسخ 204 No Content اغلب از تصویر مناسبتر است.
پرسشها
- چرا به آن خالی میگویند وقتی یک پیکسل دارد؟
- یک GIF باید دستکم یک پیکسل داشته باشد. این یکی 1×1 است و تنها رنگش شفاف علامت خورده، پس چیزی دیده نمیشود.
- آیا فایل 43 بایتی معتبر است؟
- بله. دقیقاً از مشخصات GIF89a پیروی میکند و همه موتورهای جدول بالا آن را شفاف رسم میکنند.
- چرا GIF و نه PNG یا WebP؟
- از کوچکترین PNG شفاف هم کوچکتر است، و هر مرورگر، کلاینت ایمیل و کتابخانه تصویر از 35 سال گذشته تا امروز میتواند آن را بخواند.
- از data URI استفاده کنم یا فایل؟
- data URI یک درخواست صرفهجویی میکند و برای جانگهدارها و CSS مناسب است. وقتی خودِ درخواست هدف است، مثل پیکسلهای ردیابی، به فایل یا endpoint نیاز دارید.
- کدام Content-Type را بفرستم؟
image/gif. اگر همه درخواستها باید به سرور شما برسند،Cache-Control: no-storeرا اضافه کنید.