emptygif
ภาษา: ไทย

GIF โปร่งใสที่เล็กที่สุดมีขนาด 43 ไบต์

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

GIF ขนาด 43 ไบต์แบบขยาย: พิกเซลโปร่งใสหนึ่งพิกเซล
0000
0010
0020
ดาวน์โหลด 1×1.gif

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

แต่ละไบต์ทำหน้าที่อะไร

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ขนาดโค้ดขั้นต่ำของ LZW2 ดังนั้นโค้ดที่บีบอัดจะเริ่มต้นที่ความกว้าง 3 บิต
02ขนาดบล็อกย่อยตามด้วยข้อมูลที่บีบอัด 2 ไบต์
44 01พิกเซลที่บีบอัดโค้ด LZW ที่แพ็กเรียงจากบิตต่ำสุดขึ้นไป ดูวิธีถอดรหัสได้ด้านล่าง
00ตัวปิดบล็อกบล็อกย่อยความยาวศูนย์ที่ใช้ปิดบล็อก
ส่วนท้าย ไบต์เดียวที่ระบุจุดสิ้นสุดของไฟล์
3Bส่วนท้าย0x3B (“;”) ปิดท้ายไฟล์

ภายในไบต์แบบแพ็ก

สามไบต์นี้แต่ละไบต์เก็บการตั้งค่าเล็กๆ หลายอย่าง บิต 7 อยู่ซ้ายสุด

ตัวอธิบายหน้าจอเชิงตรรกะ 0x80
1มีตารางสีส่วนกลาง
000ความละเอียดสี
0พาเลตเรียงตามความสำคัญ
000ขนาดตาราง: 2^(n+1) รายการ
ส่วนขยายควบคุมกราฟิก 0x01
000สงวนไว้
000วิธีจัดการเฟรม
0รออินพุตจากผู้ใช้
1เปิดความโปร่งใส
ตัวอธิบายภาพ 0x00
0มีตารางสีเฉพาะที่
0อินเทอร์เลซ
0พาเลตเรียงตามความสำคัญ
00สงวนไว้
000ขนาดตารางเฉพาะที่

สองไบต์เก็บหนึ่งพิกเซลได้อย่างไร

เมื่อขนาดโค้ดขั้นต่ำเป็น 2 ตัวถอดรหัสจะอ่านโค้ดขนาด 3 บิต โค้ด 4 ล้างตาราง โค้ด 5 จบภาพ และโค้ด 0 ถึง 3 คือรายการในพาเลต ไบต์ 44 01 อ่านจากบิตต่ำสุดขึ้นไป:

0x44 010001000x01 00000001

  1. 001100 = 4ล้าง: เริ่มด้วยตารางใหม่
  2. 000000 = 0พิกเซล: รายการที่ 0 ของพาเลต
  3. 101101 = 5จบภาพ
  4. 0000000 บิตเติมที่ไม่ได้ใช้

ภาพที่ใหญ่กว่าก็ใช้วิธีเดียวกัน โค้ดใหม่แต่ละตัวแทนช่วงพิกเซลที่ยาวกว่าตัวก่อนหน้าหนึ่งพิกเซล GIF โปร่งใสขนาด 1000×1000 จึงใช้เพียง 1,743 ไบต์

เล็กกว่านี้ได้ไหม?

ได้ ถ้าตัดส่วนที่ตัวถอดรหัสยอมให้ขาดได้ออกไป เราส่งแต่ละแบบให้เอนจินเบราว์เซอร์สามตัวและ Pillow แล้วบันทึกว่าแต่ละตัววาดอะไรออกมา

ขนาดแบบChromiumFirefoxWebKitPillow
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 สร้างในเบราว์เซอร์ของคุณ ไม่มีการอัปโหลดใดๆ

สีเติม
ขนาดที่ใช้บ่อย

1×1 · 43 ไบต์

ดาวน์โหลด GIF

เสิร์ฟจากสแตกของคุณ

ตัวอย่างโค้ดพร้อมรัน 173 ชุด เลือกแบบที่คุณใช้ ทุกชุดตอบกลับด้วย image/gif ที่พาธที่คุณเลือก ถ้าคุณเปลี่ยนขนาดหรือสีไว้ด้านบน ตัวอย่างโค้ดจะใช้ GIF นั้น

Elixir, Erlang & Gleam

Express JavaScript

ติดตั้ง
npm i express
ไฟล์
server.mjs
รัน
node server.mjs
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 หากทุกคำขอต้องไปถึงเซิร์ฟเวอร์ของคุณ