가장 작은 투명 GIF는 43바이트입니다.
이게 전부입니다. 바이트를 선택하면 그 역할을 볼 수 있고, 파일을 복사하거나 다운로드하거나 핫링크하거나 직접 작성한 코드에서 제공할 수 있습니다.

각 바이트가 하는 일
GIF는 블록이 이어진 구조입니다. 이 파일에는 블록이 7개 있고, 이 페이지의 각 색상은 그중 하나에 해당합니다. 바이트나 블록을 선택하면 설명이 나옵니다. 숫자는 리틀 엔디언으로 저장됩니다. 하위 바이트가 먼저 오므로 01 00은 1을 뜻합니다.
| 바이트 | 필드 | 의미 |
|---|---|---|
| 헤더 디코더에게 이 파일이 GIF이며 어떤 버전의 형식인지 알려 줍니다. | ||
| 47 49 46 | 시그니처 | ASCII 문자 “GIF”. 모든 GIF 파일은 이 문자로 시작합니다. |
| 38 39 61 | 버전 | “89a”. 투명도를 쓰려면 89a가 필요합니다. 87a에는 그래픽 제어 확장이 없습니다. |
| 논리 화면 서술자 캔버스 크기와 색상표 구성 방식. | ||
| 01 00 | 캔버스 너비 | 1px. |
| 01 00 | 캔버스 높이 | 1px. |
| 80 | 패킹 플래그 | 설정 4개를 1바이트에 담았습니다. 최상위 비트는 전역 색상표가 뒤따른다는 뜻이고, 하위 3비트는 그 크기를 나타냅니다. |
| 00 | 배경색 인덱스 | 팔레트 0번 항목. 브라우저는 이 값을 무시하고 이미지 뒤에 있는 것을 보여 줍니다. |
| 00 | 픽셀 종횡비 | 0은 정사각형 픽셀로, 보정하지 않는다는 뜻입니다. |
| 전역 색상표 팔레트입니다. 픽셀은 색상 대신 이 목록의 인덱스를 저장합니다. | ||
| FF FF FF | 팔레트 항목 | 빨강, 초록, 파랑 각 1바이트: #ffffff. GIF 색상표는 최소 2개 항목입니다. |
| 00 00 00 | 팔레트 항목 | 빨강, 초록, 파랑 각 1바이트: #000000. GIF 색상표는 최소 2개 항목입니다. |
| 그래픽 제어 확장 GIF89a에서 추가된 선택적 블록입니다. 여기서는 팔레트 0번 항목을 투명하게 만듭니다. | ||
| 21 | 확장 도입자 | 0x21(“!”)은 확장 블록의 시작을 알립니다. |
| F9 | 그래픽 제어 레이블 | 0xF9는 이 확장이 그래픽 제어 확장이라는 뜻입니다. |
| 04 | 블록 크기 | 뒤이어 4바이트의 설정이 옵니다. |
| 01 | 패킹 플래그 | 최하위 비트가 투명도 플래그입니다. 켜져 있으므로 아래의 투명 색상 인덱스가 사용됩니다. |
| 00 00 | 지연 시간 | 0 × 1/100초. 애니메이션에서만 의미가 있습니다. |
| 00 | 투명 색상 인덱스 | 팔레트 0번 항목은 완전히 투명하게 그려집니다. |
| 00 | 블록 종결자 | 블록을 닫는 길이 0의 하위 블록. |
| 이미지 서술자 캔버스에서 이미지의 위치와 크기. | ||
| 2C | 이미지 구분자 | 0x2C(“,”)로 이미지가 시작됩니다. |
| 00 00 | 왼쪽 위치 | 이미지는 캔버스 왼쪽 가장자리에서 0px 떨어진 곳에서 시작합니다. |
| 00 00 | 위쪽 위치 | 이미지는 캔버스 위쪽 가장자리에서 0px 떨어진 곳에서 시작합니다. |
| 01 00 | 이미지 너비 | 1px. |
| 01 00 | 이미지 높이 | 1px. |
| 00 | 패킹 플래그 | 로컬 색상표 없음, 인터레이스 아님. 이미지는 전역 팔레트를 사용합니다. |
| 이미지 데이터 LZW로 압축되어 최대 255바이트 크기의 하위 블록으로 나뉜 픽셀. | ||
| 02 | LZW 최소 코드 크기 | 2이므로 압축 코드는 3비트 너비로 시작합니다. |
| 02 | 하위 블록 크기 | 뒤이어 2바이트의 압축 데이터가 옵니다. |
| 44 01 | 압축된 픽셀 | 최하위 비트부터 채워 넣은 LZW 코드. 디코딩 과정은 아래에서 볼 수 있습니다. |
| 00 | 블록 종결자 | 블록을 닫는 길이 0의 하위 블록. |
| 트레일러 파일의 끝을 표시하는 1바이트. | ||
| 3B | 트레일러 | 0x3B(“;”)로 파일이 끝납니다. |
패킹된 바이트의 내부
바이트 3개가 각각 작은 설정 여러 개를 담고 있습니다. 비트 7이 가장 왼쪽입니다.
0x800x010x002바이트에 픽셀 하나를 담는 방법
최소 코드 크기가 2이면 디코더는 3비트 코드를 읽습니다. 코드 4는 테이블을 초기화하고, 코드 5는 이미지를 끝내며, 코드 0~3은 팔레트 항목입니다. 바이트 44 01은 최하위 비트부터 읽습니다.
0x44 010001000x01 00000001
- 001100 = 4초기화: 새 테이블로 시작
- 000000 = 0픽셀: 팔레트 0번 항목
- 101101 = 5이미지 끝
- 0000000 사용하지 않는 패딩 비트
더 큰 이미지도 같은 방식을 씁니다. 새 코드는 매번 직전보다 1픽셀 긴 연속 구간을 나타내므로, 1000×1000 투명 GIF도 1,743바이트면 됩니다.
더 작게 만들 수 있을까?
네, 디코더가 없어도 봐주는 부분을 빼면 됩니다. 각 변형을 브라우저 엔진 3개와 Pillow에 넣어 보고 무엇이 그려지는지 기록했습니다.
| 크기 | 변형 | Chromium | Firefox | WebKit | Pillow |
|---|---|---|---|---|---|
| 43 | 이 페이지의 표준 파일. | 투명 | 투명 | 투명 | 투명 |
| 42 | 트레일러 바이트 없음. 디코더는 어차피 데이터 끝에서 멈춥니다. | 투명 | 투명 | 투명 | 투명 |
| 37 | 팔레트가 아예 없음. 그래도 유효합니다. 사양상 디코더가 자체 팔레트를 써도 되고, 인덱스 0은 어차피 투명합니다. | 투명 | 투명 | 투명 | 투명 |
| 36 | 팔레트도 트레일러도 없음. | 투명 | 투명 | 투명 | 투명 |
| 35 | 투명도 블록 없음. 픽셀이 팔레트 0번 색상인 흰색으로 그려집니다. | 흰색 | 흰색 | 흰색 | 흰색 |
| 35 | 1987년 형식. 색상을 투명으로 지정할 방법이 없습니다. | 흰색 | 흰색 | 흰색 | 흰색 |
| 34 | 투명도 블록은 있지만 압축된 픽셀이 없음. | 투명 | 투명 | 투명 | 오류 |
| 33 | 위와 같지만 트레일러도 없음. | 투명 | 투명 | 투명 | 오류 |
| 29 | 팔레트도 투명도도 없음. 엔진마다 제각각 색을 고릅니다. | 검은색 | 흰색 | 투명 | 검은색 |
| 26 | 압축 데이터가 전혀 없는 이미지. | 투명 | 투명 | 투명 | 오류 |
| 14 | 헤더, 캔버스 크기, 트레일러만 있음. 이미지는 들어 있지 않습니다. | 투명 | 오류 | 투명 | 오류 |
어디서나 동작해야 한다면 43바이트를 쓰세요. 37바이트도 유효한 GIF이며, 테스트한 모든 엔진에서 투명하게 나왔습니다. 그보다 작으면 디코더의 관대함에 기대야 하며, 29바이트 파일은 엔진마다 결과가 어떻게 갈리는지 보여 줍니다.
2026년 9월 23일, 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 - 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="">
생성 크기는 한 변 4096px까지입니다. 트래픽이 많다면 파일을 다운로드해 직접 호스팅해 주세요.
내 스택에서 제공하기
바로 실행할 수 있는 스니펫 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);
이 스니펫은 실행해 보고, 반환된 바이트를 비교했습니다. 페이지 열기
용도
- 추적 픽셀과 비컨: 서버는 요청을 기록하고 가장 작은 유효한 이미지로 응답합니다.
- 지연 로딩 이미지의 플레이스홀더. 실제 이미지 소스가 도착하기 전에도
img태그가 유효합니다. - CSS 지원이 들쭉날쭉한 HTML 이메일에서 쓰는 고정 크기 스페이서.
- 이미지 파일을 따로 넣지 않고도 실제 이미지가 필요한 테스트와 목(mock).
추적 픽셀은 보기보다 믿을 만하지 않습니다
Apple Mail은 ‘Mail 개인정보 보호’가 켜져 있으면 원격 이미지를 프록시로 미리 불러오므로, ‘열람’이 실제 사람이 아닐 수도 있습니다. Gmail도 자체 프록시로 이미지를 가져와 캐시합니다. 많은 클라이언트는 기본적으로 원격 이미지를 차단합니다. 페이지 분석에는 이미지보다 navigator.sendBeacon()이나 204 No Content 응답이 더 잘 맞는 경우가 많습니다.
자주 묻는 질문
- 픽셀이 있는데 왜 ‘빈’ GIF인가요?
- GIF에는 최소 1픽셀이 있어야 합니다. 이 파일은 1×1이고 유일한 색상이 투명으로 지정되어 있어서 아무것도 보이지 않습니다.
- 43바이트 파일은 유효한가요?
- 네. GIF89a 사양을 정확히 따르며, 위 표의 모든 엔진이 투명하게 그립니다.
- PNG나 WebP가 아니라 왜 GIF인가요?
- 최소 크기의 투명 PNG보다 작고, 지난 35년간 나온 모든 브라우저, 이메일 클라이언트, 이미지 라이브러리가 읽을 수 있습니다.
- data URI와 파일 중 무엇을 써야 하나요?
- data URI는 요청 하나를 줄여 주므로 플레이스홀더와 CSS에 적합합니다. 추적 픽셀처럼 요청 자체가 목적이라면 파일이나 엔드포인트가 필요합니다.
- Content-Type은 무엇으로 보내야 하나요?
image/gif입니다. 모든 요청이 서버에 도달해야 한다면Cache-Control: no-store도 추가하세요.