# GIF 프레임 분리 — 모든 프레임을 PNG 한 장씩

모든 프레임을 PNG 한 장씩으로.

> 움직이는 GIF를 프레임으로 나눠 한 장씩 PNG로 저장합니다. 무료이고 전부 브라우저 안에서 돌아갑니다. 투명도와 재생 시간이 그대로 남고, 업로드는 없으며 오프라인에서도 됩니다.

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

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

GIF를 읽고 풀고 그리는 일은 전부 내 브라우저가 하고, PNG도 이 기기의 메모리 안에서 만들어집니다. 여기 있는 무언가가 보내려 한다 해도, 이 페이지 반대편에는 애니메이션을 받아 줄 서버 자체가 없습니다.

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

## GIF를 프레임으로 나누는 방법

1. **GIF를 고릅니다.** 선택 영역에 끌어다 놓거나 직접 찾아 주십시오. 브라우저가 디스크에서 바로 읽고, 페이지가 무엇을 찾았는지 알려 줍니다. 크기, 프레임 수, 재생 길이, 반복 횟수입니다.
2. **PNG 한 장에 무엇을 담을지 정합니다.** **보이는 그대로의 프레임**이 거의 모두가 원하는 쪽입니다. 애니메이션의 그 순간 화면 전체가 됩니다. **그 프레임이 저장한 픽셀만**은 파일이 실제로 들고 있는 조각으로, 제 크기와 제자리 그대로입니다. GIF가 작게 유지되는 이유가 이것이고, 애니메이션이 보이는 모습과는 다릅니다.
3. **투명도를 어떻게 할지 정합니다.** PNG는 투명도를 그대로 담을 수 있고, 그것이 정직한 기본값입니다. 투명도를 무시하고 검게 칠해 버리는 곳으로 프레임을 가져갈 거라면 대신 색으로 채우십시오.
4. **원하는 프레임을 고릅니다.** 기본은 전부입니다. '두 프레임에 한 장만 남기기'는 긴 녹화를 솎아 내는 설정이고, 격자의 체크 상자가 그보다 우선합니다. 번호는 절대 바뀌지 않으니, 옆을 아무리 버려도 42번 프레임은 계속 42번입니다.
5. **내려받습니다.** 격자에서 한 장씩 받아도 되고, 전부 한 개의 ZIP으로 받아도 됩니다. ZIP이면 저장 확인이 수백 번이 아니라 한 번으로 끝납니다. ZIP에는 각 프레임이 얼마나 머물렀는지 적은 `frames.txt`를 함께 넣을 수 있습니다. PNG만 모아 둔 폴더가 스스로 말할 수 없는 유일한 정보입니다.

## 자세한 설명

[GIF를 프레임으로 나누는 법](https://abox.tools/ko/가이드/gif-프레임-분리하기/): 움직이는 GIF의 모든 프레임을 PNG로 뽑는 방법. 어떤 프레임은 왜 그림의 작은 조각뿐인지, 투명은 어떻게 되는지, 그리고 다시 합칠 수 있도록 시간 정보를 남기는 법.

## 상자 속 다른 도구

- [GIF 분석](https://abox.tools/ko/gif-분석/): 프레임, 재생 시간, 팔레트, 그리고 바이트가 어디로 갔는지.
- [이미지를 동영상으로](https://abox.tools/ko/사진으로-동영상-만들기/): 이미지가 든 폴더 하나를 동영상으로.
- [동영상 구간 자르기](https://abox.tools/ko/동영상-자르기/): 재생하면서 남길 구간을 표시하세요. 그 구간들이 영상 하나로 돌아옵니다.
- [동영상 화면 자르기](https://abox.tools/ko/동영상-화면-자르기/): 필요한 부분만 남기고 화면을 도려냅니다.

## 자주 묻는 질문

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

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

### 프레임 하나가 그림의 작은 조각처럼 보이는 이유가 뭔가요?

파일이 그렇게 담고 있기 때문입니다. GIF는 첫 그림 하나에 이어 붙은 조각들입니다. 뒤의 프레임은 바뀐 사각형만 저장하고, 화면의 나머지는 앞 프레임들이 남겨 둔 것입니다. 가만한 벽 앞에서 말하는 사람 영상이라면 프레임마다 얼굴만 저장되지 그림 전체가 저장되지는 않습니다. 이 포맷이 거대해지지 않는 이유가 바로 그것입니다. \
\
지금 그렇게 보이는 것은 '그 프레임이 저장한 픽셀만'이 선택돼 있어서입니다. '보이는 그대로의 프레임'으로 바꾸면 모든 PNG가 그 순간 애니메이션의 화면 전체가 됩니다.

### 투명도는 유지되나요?

유지됩니다. GIF의 투명도는 1비트라서 픽셀은 칠해졌거나 보이지 않거나 둘 중 하나이고 그 사이는 없습니다. PNG가 바로 그것을 담기 때문에 투명한 영역이 그대로 나옵니다. 꽉 찬 배경이 낫다면 '투명한 영역'을 색으로 채우도록 바꾸십시오. 그 색은 PNG에 적히고 나중에 되돌릴 수 없습니다.

### 프레임 시간이 예상한 숫자와 다른 이유는 뭔가요?

GIF는 각 프레임 시간을 100분의 1초 단위로 담는데, 브라우저는 1990년대부터 2 미만인 값을 0.1초로 끌어올립니다. 당시 돌아가던 지구본을 위해 쓰인 규칙이고 끝내 없어지지 않았습니다. 파일에 0.01초라고 적힌 프레임은 어디서나 0.10초로 재생됩니다. 이 도구는 실제로 재생되는 시간을 보여 주고, 파일에 적힌 값과 다르면 그 값도 옆에 적어 둡니다.

### 분리한 프레임을 다시 합칠 수 있나요?

있습니다. 이 사이트의 [GIF 만들기](https://abox.tools/ko/gif-만들기/)를 쓰거나, 이미지 폴더를 받아 주는 다른 프로그램을 쓰셔도 됩니다. ZIP 안의 `frames.txt`가 그래서 있습니다. 애니메이션을 분리하면 타이밍이 사라집니다. PNG에는 얼마나 머물렀는지 적어 둘 자리가 없으니까요. 대신 그 목록이 각 프레임의 시간과 위치를 함께 들고 나옵니다.

### 프레임은 어떤 형식으로 저장되나요?

PNG이고, 일부러 PNG만입니다. GIF 프레임은 많아야 256색에 투명도가 1비트인데, PNG는 그것을 정확히 손실 없이 담습니다. JPEG였다면 투명도를 버리고, 프레임에 없던 색을 만들어 내고, 평평한 그림에서는 보통 더 *큰* 파일이 나옵니다. JPEG가 필요하시면 나중에 [이미지 크기 조절](https://abox.tools/ko/이미지-크기-조절/)로 변환하십시오.

### 읽을 수 있는 프레임 수에 제한이 있나요?

정해진 제한은 없습니다. 실제 한계는 내 기기의 메모리입니다. GIF는 읽는 동안 픽셀 하나, 프레임 하나마다 1바이트 정도로 부풀기 때문에 작은 파일도 아주 많은 메모리가 될 수 있습니다. 그래서 이 페이지는 탭이 죽게 두느니 읽기를 멈춥니다. 그런 일이 생기면 그렇게 말하고, 거기까지 얻은 프레임을 돌려줍니다.

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

대개 열립니다. 중간에 끊긴 다운로드, 없어진 종료 표시, 데이터 도중에 끝나는 마지막 프레임은 모두 흔한 일이고, 그런 걸 거절하는 판독기는 사람들이 가장 뜯어보고 싶어 하는 파일에서 하필 쓸모가 없습니다. 온전한 프레임은 전부 돌아오고, 무엇이 잘못됐는지도 함께 적힙니다. 아예 GIF가 아닌 파일만 처음부터 거절됩니다.

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

무료이고 계정도, 로그인도, 체험판도 없습니다. 프레임에 워터마크도 없습니다. 이 사이트는 광고로 유지되는데, 그 광고에도 내 파일에 관한 것은 넘어가지 않습니다.

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

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

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

- **내 GIF는 나갈 곳이 없습니다.** Content-Security-Policy에는 이 페이지가 연결할 수 있는 주소가 전부 적혀 있고, 그중 이 사이트 것은 하나도 없습니다. 파일이 모일 수 있는 수신처가 여기엔 없고, 있다 한들 그리로 보낼 코드도 없습니다. 예전에는 이 자리에 예외를 두지 않는 `connect-src 'none'`이 있었습니다. 광고를 넣으면서 그걸 잃었고, 그 사실을 말하는 것까지가 약속입니다.
- **GIF 판독기는 이 저장소의 파일 두 개입니다.** 브라우저는 GIF를 재생해 주기는 해도 그 부품을 건네주지는 않습니다. 그래서 포맷을 여기서 직접 읽습니다. `src/gif.js`가 컨테이너와 LZW 압축 해제, `src/compose.js`가 앞 프레임들이 아래 깔린 상태에서 각 프레임이 어떻게 보일지 정하는 폐기 규칙입니다. 파일을 열려고 무언가를 받아 오지 않고, 처음 쓸 때 내려받는 엔진도 없습니다.
- **구글이 불러오는 것과, 구글에게 주지 않는 것.** 광고와 측정 스크립트는 구글에서 옵니다. 둘 중 어느 쪽에도 내 애니메이션에 관한 것은 넘어가지 않습니다. 파일도, 프레임도, 이름도, 크기도, 장수도 마찬가지입니다. 그림을 읽고 풀고 그리고 써 내는 코드는 한 줄도 빠짐없이 이 출처에서 제공되고 저장소에 공개되어 있습니다.
- **후원 버튼이 불러오는 것과, 거기에 주지 않는 것.** 머리글의 'Buy me a coffee' 버튼은 cdnjs.buymeacoffee.com의 스크립트가 그리고 글꼴은 Google Fonts에서 가져옵니다. 그것은 링크 이상은 아닙니다. 방문을 알리지도 않고, 나에 대해서도 내 파일에 대해서도 건네받는 것이 없습니다. 누르지 않으면 아무 일도 일어나지 않고, 눌러서 가는 곳은 남의 사이트입니다.
- **오프라인에서도 동작합니다.** 네트워크를 끊어도 이 페이지의 모든 부분이 그대로 동작합니다. 가장 간단한 증거입니다. 분리하려고 애니메이션을 어딘가로 보내는 도구라면 선을 뽑는 순간 멈출 테니까요.

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

먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 `config/site.toml`, 프레임을 풀어내는 판독기는 `src/gif.js`, 그것들을 겹쳐 놓는 규칙은 `src/compose.js`입니다. 둘 중 어디에도 네트워크에 닿을 수 있는 줄은 없습니다.
