# GIF 분석 — GIF 안에 실제로 무엇이 있는지

프레임, 재생 시간, 팔레트, 그리고 바이트가 어디로 갔는지.

> 브라우저에서 GIF를 뜯어봅니다. 프레임마다의 재생 시간과 폐기 방식, 색상 표, 반복 횟수, 그리고 용량이 어디로 갔는지 바이트 단위로 보여 줍니다. 아무것도 업로드되지 않습니다.

이 페이지는 브라우저 안에서만 동작하는 대화형 도구입니다(https://abox.tools/ko/gif-분석/). 도구에 넘긴 어떤 것도 업로드되지 않습니다. 아래는 이 페이지가 도구에 대해 글로 설명하는 내용 전부입니다. 도구를 쓰려면 이 주소를 여세요.

## GIF는 **절대 업로드되지 않습니다**. 서버가 아예 없으니까요.

파일을 열고 뜯어보는 일은 내 브라우저가 합니다. 블록 구조를 읽는 것도, LZW를 푸는 것도, 이 페이지에 그려지는 모든 프레임도 이 기기에서 일어납니다. 여기 있는 무언가가 보내려 한다 해도, 이 페이지 반대편에는 파일을 받아 줄 서버 자체가 없습니다.

- ✗ 업로드 없음
- ✗ 가입 없음
- ✓ 오프라인 동작
- ✓ 오픈 소스
- ✓ 파일은 기기 밖으로 나가지 않음

## GIF를 분석하는 방법

1. **GIF를 고릅니다.** 선택 영역에 끌어다 놓거나 직접 찾아 주십시오. 브라우저가 디스크에서 바로 읽고, 그동안 무엇도 어디로 나가지 않습니다.
2. **요약부터 읽으십시오.** 캔버스 크기, 프레임 수, 애니메이션이 스스로 밝히는 길이, 그리고 실제로 재생되는 길이입니다. 뒤의 둘은 사람들이 생각하는 것보다 자주 어긋나고, 이유는 다음 절에 있습니다.
3. **눈에 띄는 것을 보십시오.** 거기 적힌 한 줄 한 줄이 내 파일에서 잰 값입니다. 어느 브라우저도 지키지 않을 재생 시간, 빠져 있는 반복 블록, 아무도 가리키지 않는 색상 표, 어떤 프레임보다 큰 메타데이터. 무엇을 만들려 했는지에 대한 추측은 하나도 없습니다.
4. **바이트가 어디로 갔는지 보십시오.** 파일의 모든 바이트가 딱 한 줄에 들어가고, 줄을 더하면 파일이 됩니다. 대부분이 '압축된 픽셀'에 있지 않다면, 표의 나머지가 그것이 대신 어디에 있는지 말해 줍니다.
5. **프레임을 훑어보십시오.** 각 프레임마다 재생 시간, 사각형, 폐기 방식, 크기가 나옵니다. '프레임마다의 캔버스'와 '각 프레임이 저장한 것만'을 번갈아 보십시오. 파일이 최적화됐는지는 뒤쪽에서 드러납니다. 잘 만든 GIF는 아주 작은 사각형만 저장하고, 못 만든 GIF는 매번 그림 전체를 저장하니까요.
6. **필요하면 보고서를 가져가십시오.** 분석 전체를 일반 텍스트로. 메시지에 붙여 넣어도 되고 파일 옆에 두어도 됩니다. 이미 화면에 있는 내용으로 페이지 안에서 만들어집니다.

## 자세한 설명

[GIF 안에는 실제로 무엇이 있나](https://abox.tools/ko/가이드/gif-파일-구조/): 프레임, 지연 시간, 처리 방식, 색 표를 설명합니다. 브라우저가 가장 짧은 지연 시간을 받아 주지 않는 이유, 그리고 GIF의 용량이 실제로 어디로 갔는지 알아내는 법.

## 상자 속 다른 도구

- [이미지를 동영상으로](https://abox.tools/ko/사진으로-동영상-만들기/): 이미지가 든 폴더 하나를 동영상으로.
- [동영상 구간 자르기](https://abox.tools/ko/동영상-자르기/): 재생하면서 남길 구간을 표시하세요. 그 구간들이 영상 하나로 돌아옵니다.
- [동영상 화면 자르기](https://abox.tools/ko/동영상-화면-자르기/): 필요한 부분만 남기고 화면을 도려냅니다.
- [동영상 거꾸로 재생](https://abox.tools/ko/동영상-거꾸로-재생/): 마지막 프레임부터, 소리까지 함께.

## 자주 묻는 질문

### 제 GIF가 어딘가로 업로드되나요?

아닙니다. 파일을 읽고 풀고 그리는 일은 내 브라우저가 내 하드웨어에서 합니다. 이 도구에는 서버 쪽이 없고, 페이지의 `Content-Security-Policy`에는 연결할 수 있는 주소가 전부 적혀 있는데 그중 이 사이트 것은 없습니다. 네트워크를 끊어도 GIF 분석은 계속 됩니다.

### 재생 시간에 적힌 것보다 느리게 도는 이유가 뭔가요?

모든 브라우저가 100분의 2초 미만인 재생 시간을 지키기를 거부하고, 대신 그 프레임을 0.1초 동안 붙들기 때문입니다. 이 규칙은 1996년 넷스케이프에 들어갔습니다. 당시 돌아가던 지구본과 '공사 중' 표지를 위한 것이었고, 이후 모든 브라우저로 베껴졌으며 아무도 없앤 적이 없습니다. \
\
그래서 모든 프레임이 0.01초라고 적힌 GIF는 초당 100프레임으로 돌지 않습니다. 초당 10프레임, 즉 만든 프로그램이 의도한 것보다 다섯에서 열 배 느리게 돕니다. 이 페이지는 파일이 말하는 값과 실제로 벌어질 값을 둘 다 보여 주고, 영향을 받는 프레임에 표시를 합니다. 고치려면 파일을 만든 프로그램에서 0.01 대신 0.02를 쓰면 됩니다.

### '폐기'가 무슨 뜻인가요?

한 프레임의 시간이 끝났을 때 화면에 무엇을 남길지입니다. 애니메이션이 제대로 보이느냐 번지느냐를 가르는 항목이 바로 이것입니다. \
\
**그대로 두기**는 다음 프레임이 그 위에 덮어 그린다는 뜻이고, 프레임이 불투명해서 서로를 가릴 때 원하는 방식입니다. **배경까지 지우기**는 그 프레임의 사각형을 먼저 지우는데, 투명도가 필요로 하는 방식입니다. 그러지 않으면 다음 프레임의 비치는 부분으로 앞 프레임이 보입니다. **아래 있던 것 되돌리기**는 이 프레임이 그리기 전에 거기 있던 것을 되돌려 놓습니다. 멈춰 있는 배경 위를 작은 물체가 움직이는 영상이 이렇게 저장됩니다. 그리고 **지정 안 함**은 파일이 아무 말도 하지 않았다는 뜻이고, 모든 뷰어가 이를 '그대로 두기'로 취급합니다.

### 제 GIF는 왜 이렇게 큰가요?

'바이트가 어디로 갔는지' 표가 일반론이 아니라 이 파일에 대해 답해 줍니다. 가능한 답은 몇 가지뿐입니다. \
\
거의 전부가 **압축된 픽셀**이라면, 파일이 그냥 그림이 많다는 뜻입니다. GIF는 모든 프레임을 통째 픽셀로 저장하고, 움직임 보정도 품질 조절기도 없습니다. 그래서 용량은 대략 넓이 곱하기 프레임 수입니다. 프레임을 줄이거나, 크기를 줄이거나, 색을 줄이는 것이 유일한 지렛대입니다. \
\
큰 몫이 **색상 표**라면, 파일이 프레임마다 768바이트짜리 팔레트를 쓰고 있는 것입니다. 큰 몫이 **메타데이터**라면 어떤 편집기가 XMP 패킷을 남기고 간 것이고, 그림을 건드리지 않고 뺄 수 있습니다. 그리고 모든 프레임이 캔버스 전체를 덮고 있다면, 어느 부분이 실제로 바뀌었는지 인코더가 끝내 알아내지 않은 것입니다. 촬영하거나 녹화한 것이라면 그게 파일의 대부분입니다.

### 두 가지 프레임 보기는 뭐가 다른가요?

**프레임마다의 캔버스**는 뷰어가 그 순간 보여 주는 것입니다. 앞 프레임들이 남긴 것 위에 이 프레임이 그려진 상태죠. **각 프레임이 저장한 것만**은 그 프레임을 위해 파일이 실제로 들고 있는 사각형이고, 아래에 아무것도 깔지 않은 그 자체입니다. \
\
재미있는 쪽은 두 번째입니다. GIF는 한 프레임을 바뀐 부분만으로 저장할 수 있고, 거의 멈춰 있는 창을 찍은 화면 녹화가 작을 수 있는 이유가 그것입니다. 내 파일의 모든 프레임이 캔버스 전체라면 그 일을 아무도 하지 않은 것이고, 애니메이션을 봐서는 알 수 없습니다. 저장된 것을 봐야 알 수 있습니다.

### 제 파일에 주석이나 XMP가 있다고 나옵니다. 그게 뭔가요?

그림과 함께 실려 다니지만 어떤 뷰어도 그리지 않는 텍스트입니다. 주석 블록은 대개 그 파일을 쓴 프로그램의 이름입니다. XMP 패킷은 이미지 편집기가 자기가 한 일을 적어 두는 XML이고, 편집 이력과 프로그램 버전, 때로는 작성자 이름까지 담습니다. \
\
이 페이지는 둘 다 전부 찍어 줍니다. 메타데이터에서 흥미로운 것은 그것이 있다는 사실이 아니라 거기에 무엇이 적혀 있느냐이니까요. 그것은 나에게만 보입니다. 이 저장소 안에 그것을 누군가에게 읽어 주는 코드는 없습니다.

### 망가진 GIF도 열리나요?

시도하고, 어디서 포기했는지 알려 줍니다. 블록 중간에서 끝나는 파일, 블록 표시가 있어야 할 자리에 다른 바이트가 있는 파일, 압축 데이터가 일찍 떨어지는 프레임이 있는 파일도 그 지점까지 읽힌 것은 전부 보여 주고, 무엇이 문제였는지 맨 위에 적어 둡니다. 분석이 가장 필요해지는 순간이 바로 그때이니, 바이트 하나 때문에 파일 전체를 버리는 것은 옳은 동작이 아닙니다.

### 제 파일이 바뀌나요?

아닙니다. 이 도구는 읽기만 합니다. 출력 파일도, 재인코딩도, GIF를 쓰는 버튼도 없습니다. 내려받을 수 있는 것은 분석 결과의 텍스트 사본뿐입니다. 원본은 디스크에 그대로 있습니다. 탭을 닫으면 어떻게 되느냐는 물음에 대한 정직한 답도 같습니다.

### 무료인가요? 가입해야 하나요?

무료이고 계정도, 로그인도, 체험판도 없습니다. 파일 크기 제한도 내 기기의 메모리 말고는 없습니다. 이 사이트는 광고로 유지되는데, 그 광고에도 내 파일에 관한 것은 넘어가지 않습니다.

### 오프라인에서도 되나요?

됩니다. 페이지를 한 번 불러온 다음 인터넷을 끊어도 계속 동작합니다. 아무것도 업로드되지 않는다는 가장 간단한 증명이기도 하고요. 분석하려고 GIF를 어딘가로 보내는 도구라면 선을 뽑는 순간 멈춰 버릴 테니까요.

## 이 약속을 직접 확인하는 방법

- **내 GIF는 나갈 곳이 없습니다.** Content-Security-Policy에는 이 페이지가 연결할 수 있는 주소가 전부 적혀 있고, 그중 이 사이트 것은 하나도 없습니다. 파일이 모일 수 있는 수신처가 여기엔 없고, 있다 한들 그리로 보낼 코드도 없습니다. 예전에는 이 자리에 예외를 두지 않는 `connect-src 'none'`이 있었습니다. 광고를 넣으면서 그걸 잃었고, 그 사실을 말하는 것까지가 약속입니다.
- **판독기는 이 저장소의 파일 네 개입니다.** 파일 안에 무엇이 있는지 알아내는 데 브라우저의 GIF 디코더를 쓰지 않습니다. 그 디코더는 어느 바이트가 어디로 갔는지 말해 주지 않으니까요. 그래서 포맷을 손으로 읽습니다. `src/gif.js`가 블록을 훑고, `src/lzw.js`가 픽셀을 펼치고, `src/frames.js`가 그것을 쌓고, `src/budget.js`가 조각들을 다시 더해서 파일 크기가 맞는지 확인합니다.
- **주석과 메타데이터는 나에게만 보입니다.** GIF에는 주석 블록이나, 어떤 편집을 했는지 적은 XMP 패킷, 색상 프로파일이 들어 있을 수 있고, 이 페이지는 그것을 전부 찍어 줍니다. 그것들은 눈앞의 화면에 놓일 뿐 다른 어디로도 가지 않습니다. 이 저장소에는 그것을 실어 보내는 분석 이벤트가 하나도 없고, 있다 한들 이 페이지는 보낼 수 없습니다.
- **구글이 불러오는 것과, 구글에게 주지 않는 것.** 광고와 측정 스크립트는 구글에서 옵니다. 둘 중 어느 쪽에도 내 파일에 관한 것은 넘어가지 않습니다. 파일도, 미리보기도, 이름도, 크기도, 프레임 수도, 주석도 마찬가지입니다. GIF를 읽고 풀고 그리는 코드는 한 줄도 빠짐없이 이 출처에서 제공되고 저장소에 공개되어 있습니다.
- **후원 버튼이 불러오는 것과, 거기에 주지 않는 것.** 머리글의 'Buy me a coffee' 버튼은 cdnjs.buymeacoffee.com의 스크립트가 그리고 글꼴은 Google Fonts에서 가져옵니다. 그것은 링크 이상은 아닙니다. 방문을 알리지도 않고, 나에 대해서도 내 파일에 대해서도 건네받는 것이 없습니다. 누르지 않으면 아무 일도 일어나지 않고, 눌러서 가는 곳은 남의 사이트입니다.
- **오프라인에서도 동작합니다.** 네트워크를 끊어도 이 페이지의 모든 부분이 그대로 동작합니다. 가장 간단한 증거입니다. 분석하려고 GIF를 어딘가로 보내는 도구라면 선을 뽑는 순간 멈출 테니까요.

**직접 확인해 보세요.** 위에 적은 어느 것도 그냥 믿으실 필요는 없습니다. 이 페이지는 저장소 안의 템플릿과 설정을 빌드 스크립트가 찍어 낸 결과이고, 그 스크립트는 누구나 읽고 직접 돌려 볼 수 있습니다. 결과물은 `dist` 브랜치에 그대로 올라가 있고요. 그래서 실제로 제공되는 파일과 소스를 빌드한 결과를 나란히 놓고 비교해 보실 수 있습니다: https://github.com/A-Box-of-Tools/website

먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 `config/site.toml`, 파일을 훑는 블록 판독기는 `src/gif.js`, 압축을 푸는 쪽은 `src/lzw.js`, 바이트를 계산하는 쪽은 `src/budget.js`입니다. 어느 것에도 네트워크에 닿을 수 있는 줄은 없습니다.
