GIF โปร่งใสที่เล็กที่สุดมีขนาด 43 ไบต์
นี่คือทั้งหมดของมัน เลือกไบต์ใดก็ได้เพื่อดูว่ามันทำหน้าที่อะไร จากนั้นคัดลอกไฟล์ ดาวน์โหลด ฮอตลิงก์ หรือเสิร์ฟจากโค้ดของคุณเอง

แต่ละไบต์ทำหน้าที่อะไร
GIF คือลำดับของบล็อก ไฟล์นี้มีเจ็ดบล็อก และทุกสีบนหน้านี้เป็นของบล็อกใดบล็อกหนึ่ง เลือกไบต์หรือบล็อกเพื่ออ่านคำอธิบาย ตัวเลขจัดเก็บแบบ little-endian: ไบต์ต่ำมาก่อน ดังนั้น 01 00 จึงหมายถึง 1
| ไบต์ | ฟิลด์ | ความหมาย |
|---|---|---|
| ส่วนหัว บอกตัวถอดรหัสว่านี่คือ GIF และเป็นรูปแบบเวอร์ชันใด | ||
| 47 49 46 | ลายเซ็น | ตัวอักษร ASCII “GIF” ไฟล์ GIF ทุกไฟล์ขึ้นต้นด้วยตัวอักษรเหล่านี้ |
| 38 39 61 | เวอร์ชัน | “89a” ต้องใช้ 89a จึงจะโปร่งใสได้ ส่วน 87a ไม่มีส่วนขยายควบคุมกราฟิก |
| ตัวอธิบายหน้าจอเชิงตรรกะ ขนาดของแคนวาสและวิธีตั้งค่าตารางสี | ||
| 01 00 | ความกว้างแคนวาส | 1 พิกเซล |
| 01 00 | ความสูงแคนวาส | 1 พิกเซล |
| 80 | แฟล็กแบบแพ็ก | การตั้งค่าสี่อย่างอัดรวมอยู่ในไบต์เดียว บิตบนสุดบอกว่ามีตารางสีส่วนกลางตามมา ส่วนสามบิตล่างสุดบอกขนาดของตาราง |
| 00 | ดัชนีสีพื้นหลัง | รายการที่ 0 ของพาเลต เบราว์เซอร์จะไม่สนใจค่านี้และแสดงสิ่งที่อยู่ด้านหลังภาพแทน |
| 00 | อัตราส่วนพิกเซล | 0 หมายถึงพิกเซลสี่เหลี่ยมจัตุรัส ไม่มีการปรับแก้ |
| ตารางสีส่วนกลาง พาเลตสี พิกเซลจะเก็บดัชนีที่ชี้ไปยังรายการนี้แทนการเก็บสี | ||
| FF FF FF | รายการในพาเลต | แดง เขียว และน้ำเงิน อย่างละหนึ่งไบต์: #ffffff ตารางสีของ GIF มีได้เล็กสุดสองรายการ |
| 00 00 00 | รายการในพาเลต | แดง เขียว และน้ำเงิน อย่างละหนึ่งไบต์: #000000 ตารางสีของ GIF มีได้เล็กสุดสองรายการ |
| ส่วนขยายควบคุมกราฟิก บล็อกเสริมที่เพิ่มเข้ามาใน GIF89a ในที่นี้ใช้ทำให้รายการที่ 0 ของพาเลตโปร่งใส | ||
| 21 | ตัวนำส่วนขยาย | 0x21 (“!”) ประกาศว่าต่อไปเป็นบล็อกส่วนขยาย |
| F9 | ป้ายควบคุมกราฟิก | 0xF9 บอกว่าส่วนขยายนี้คือส่วนขยายควบคุมกราฟิก |
| 04 | ขนาดบล็อก | ตามด้วยการตั้งค่า 4 ไบต์ |
| 01 | แฟล็กแบบแพ็ก | บิตต่ำสุดคือแฟล็กความโปร่งใส ซึ่งเปิดอยู่ จึงใช้ดัชนีสีโปร่งใสด้านล่าง |
| 00 00 | หน่วงเวลา | 0 ในร้อยวินาที มีผลเฉพาะกับภาพเคลื่อนไหว |
| 00 | ดัชนีสีโปร่งใส | รายการที่ 0 ของพาเลตจะถูกวาดให้โปร่งใสทั้งหมด |
| 00 | ตัวปิดบล็อก | บล็อกย่อยความยาวศูนย์ที่ใช้ปิดบล็อก |
| ตัวอธิบายภาพ ตำแหน่งของภาพบนแคนวาสและขนาดของภาพ | ||
| 2C | ตัวคั่นภาพ | 0x2C (“,”) เริ่มต้นภาพ |
| 00 00 | ซ้าย | ภาพเริ่มห่างจากขอบซ้ายของแคนวาส 0 พิกเซล |
| 00 00 | บน | ภาพเริ่มห่างจากขอบบนของแคนวาส 0 พิกเซล |
| 01 00 | ความกว้างภาพ | 1 พิกเซล |
| 01 00 | ความสูงภาพ | 1 พิกเซล |
| 00 | แฟล็กแบบแพ็ก | ไม่มีตารางสีเฉพาะที่ ไม่ใช่แบบอินเทอร์เลซ ภาพใช้พาเลตส่วนกลาง |
| ข้อมูลภาพ พิกเซลที่บีบอัดด้วย LZW และแบ่งเป็นบล็อกย่อยขนาดไม่เกิน 255 ไบต์ | ||
| 02 | ขนาดโค้ดขั้นต่ำของ LZW | 2 ดังนั้นโค้ดที่บีบอัดจะเริ่มต้นที่ความกว้าง 3 บิต |
| 02 | ขนาดบล็อกย่อย | ตามด้วยข้อมูลที่บีบอัด 2 ไบต์ |
| 44 01 | พิกเซลที่บีบอัด | โค้ด LZW ที่แพ็กเรียงจากบิตต่ำสุดขึ้นไป ดูวิธีถอดรหัสได้ด้านล่าง |
| 00 | ตัวปิดบล็อก | บล็อกย่อยความยาวศูนย์ที่ใช้ปิดบล็อก |
| ส่วนท้าย ไบต์เดียวที่ระบุจุดสิ้นสุดของไฟล์ | ||
| 3B | ส่วนท้าย | 0x3B (“;”) ปิดท้ายไฟล์ |
ภายในไบต์แบบแพ็ก
สามไบต์นี้แต่ละไบต์เก็บการตั้งค่าเล็กๆ หลายอย่าง บิต 7 อยู่ซ้ายสุด
0x800x010x00สองไบต์เก็บหนึ่งพิกเซลได้อย่างไร
เมื่อขนาดโค้ดขั้นต่ำเป็น 2 ตัวถอดรหัสจะอ่านโค้ดขนาด 3 บิต โค้ด 4 ล้างตาราง โค้ด 5 จบภาพ และโค้ด 0 ถึง 3 คือรายการในพาเลต ไบต์ 44 01 อ่านจากบิตต่ำสุดขึ้นไป:
0x44 010001000x01 00000001
- 001100 = 4ล้าง: เริ่มด้วยตารางใหม่
- 000000 = 0พิกเซล: รายการที่ 0 ของพาเลต
- 101101 = 5จบภาพ
- 0000000 บิตเติมที่ไม่ได้ใช้
ภาพที่ใหญ่กว่าก็ใช้วิธีเดียวกัน โค้ดใหม่แต่ละตัวแทนช่วงพิกเซลที่ยาวกว่าตัวก่อนหน้าหนึ่งพิกเซล GIF โปร่งใสขนาด 1000×1000 จึงใช้เพียง 1,743 ไบต์
เล็กกว่านี้ได้ไหม?
ได้ ถ้าตัดส่วนที่ตัวถอดรหัสยอมให้ขาดได้ออกไป เราส่งแต่ละแบบให้เอนจินเบราว์เซอร์สามตัวและ Pillow แล้วบันทึกว่าแต่ละตัววาดอะไรออกมา
| ขนาด | แบบ | Chromium | Firefox | WebKit | Pillow |
|---|---|---|---|---|---|
| 43 | ไฟล์มาตรฐานบนหน้านี้ | โปร่งใส | โปร่งใส | โปร่งใส | โปร่งใส |
| 42 | ไม่มีไบต์ส่วนท้าย อย่างไรก็ตามตัวถอดรหัสจะหยุดเมื่อถึงท้ายข้อมูลอยู่แล้ว | โปร่งใส | โปร่งใส | โปร่งใส | โปร่งใส |
| 37 | ไม่มีพาเลตเลย แต่ยังถูกต้อง: สเปกอนุญาตให้ตัวถอดรหัสใช้พาเลตของตัวเอง และดัชนี 0 ก็โปร่งใสอยู่แล้ว | โปร่งใส | โปร่งใส | โปร่งใส | โปร่งใส |
| 36 | ไม่มีพาเลตและไม่มีส่วนท้าย | โปร่งใส | โปร่งใส | โปร่งใส | โปร่งใส |
| 35 | ไม่มีบล็อกความโปร่งใส: พิกเซลจะถูกวาดด้วยสีที่ 0 ของพาเลต คือสีขาว | ขาว | ขาว | ขาว | ขาว |
| 35 | รูปแบบปี 1987 ไม่มีวิธีกำหนดให้สีใดโปร่งใส | ขาว | ขาว | ขาว | ขาว |
| 34 | มีบล็อกความโปร่งใส แต่ไม่มีพิกเซลที่บีบอัด | โปร่งใส | โปร่งใส | โปร่งใส | ข้อผิดพลาด |
| 33 | เหมือนข้างบน แต่ไม่มีส่วนท้าย | โปร่งใส | โปร่งใส | โปร่งใส | ข้อผิดพลาด |
| 29 | ไม่มีพาเลตและไม่มีความโปร่งใส แต่ละเอนจินเลือกสีเอง | ดำ | ขาว | โปร่งใส | ดำ |
| 26 | ภาพที่ไม่มีข้อมูลบีบอัดเลย | โปร่งใส | โปร่งใส | โปร่งใส | ข้อผิดพลาด |
| 14 | มีเพียงส่วนหัว ขนาดแคนวาส และส่วนท้าย ไม่มีภาพอยู่ข้างใน | โปร่งใส | ข้อผิดพลาด | โปร่งใส | ข้อผิดพลาด |
ใช้ 43 ไบต์เมื่อต้องทำงานได้ทุกที่ 37 ไบต์ยังเป็น GIF ที่ถูกต้องและโปร่งใสในทุกเอนจินที่เราทดสอบ ถ้าเล็กกว่านั้นจะต้องพึ่งความยืดหยุ่นของตัวถอดรหัส และไฟล์ 29 ไบต์ก็แสดงให้เห็นว่าแต่ละเอนจินให้ผลต่างกัน
ตรวจสอบเมื่อ 23 กันยายน 2569 ด้วย Chromium 153.0.8010.12, Firefox 155.0, WebKit 26.6, Pillow 12.2.0
สร้างขนาดใดก็ได้
โปร่งใสหรือสีทึบ ตั้งแต่ 1×1 ถึง 65535×65535 สร้างในเบราว์เซอร์ของคุณ ไม่มีการอัปโหลดใดๆ
ฮอตลิงก์
ลิงก์ไปยังไฟล์เหล่านี้ได้โดยตรงจากเว็บไซต์ อีเมล หรือแอปใดก็ได้ ไฟล์เสิร์ฟจาก edge ของ 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 - สรุปสำหรับเอเจนต์ 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 พิกเซลต่อด้าน หากมีทราฟฟิกสูง โปรดดาวน์โหลดไฟล์ไปโฮสต์เอง
เสิร์ฟจากสแตกของคุณ
ตัวอย่างโค้ดพร้อมรัน 173 ชุด เลือกแบบที่คุณใช้ ทุกชุดตอบกลับด้วย 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 ได้ไม่สม่ำเสมอ
- การทดสอบและ mock ที่ต้องการภาพจริงโดยไม่ต้องแนบไฟล์ภาพไปด้วย
พิกเซลติดตามเชื่อถือได้น้อยกว่าที่เห็น
เมื่อเปิดการป้องกันความเป็นส่วนตัวของเมล 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หากทุกคำขอต้องไปถึงเซิร์ฟเวอร์ของคุณ