# 이미지 압축 — 원하는 용량에 정확히 맞추기

용량만 말씀하세요. 나머지는 알아서 맞춥니다.

> JPEG, PNG, WebP를 원하는 용량에 딱 맞춰 압축합니다. 100KB든 2MB든 상관없습니다. 전부 브라우저 안에서 돌아갑니다. 업로드 없음, 회원가입 없음, 오프라인에서도 동작.

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

## 이미지 파일은 **절대 업로드되지 않습니다**. 서버가 아예 없으니까요.

압축은 내 브라우저가 내 기기의 성능으로, 브라우저에 이미 들어 있는 인코더를 써서 합니다. 이 도구에는 네트워크 기능이 아예 없습니다. 가져올 것도 보낼 것도 없어요. 설령 보내려 해도 이 페이지 반대편에는 사진을 받아 줄 서버가 없습니다.

- ✗ 업로드 없음
- ✗ 가입 없음
- ✗ 용량 제한 없음
- ✓ 오프라인 동작
- ✓ 오픈 소스

## 이미지를 원하는 용량으로 압축하는 방법

1. **이미지를 고릅니다.** 선택 영역에 끌어다 놓거나 직접 골라 주세요. 브라우저가 디스크에서 곧바로 읽습니다. 그동안 어디로도 아무것도 나가지 않습니다.
2. **맞추라고 들은 용량을 입력합니다.** 사진을 계속 거부하는 업로드 양식이면 100KB, 지원서 포털이면 500KB, 빨리 떠야 하는 페이지면 2MB. 자주 쓰이는 네 가지는 버튼으로 두었습니다.
3. **"목표 용량으로 압축"을 누릅니다.** 들어맞는 가장 높은 화질을 좁혀 가는 동안 이미지는 여러 번 인코딩됩니다. 이미 목표보다 작은 파일은 손대지 않고 그대로 둡니다.
4. **대가를 확인하고 내려받습니다.** 결과마다 어떤 형식으로 썼는지, 화질은 얼마였는지, 가로세로가 바뀌었는지, 재 봤을 때 원본과 얼마나 가까운지가 적혀 있습니다. "비교"를 누르면 두 사진을 나란히 놓습니다.

## 자세한 설명

[이미지를 정확한 용량으로 압축하는 방법](https://abox.tools/ko/가이드/이미지-용량-줄이기/): 업로드 양식은 500KB를 요구하는데 사진은 4MB입니다. 용량 제한이 실제로 무엇을 앗아 가는지, 어느 설정부터 움직여야 하는지, 그리고 PNG가 JPEG처럼 줄어들지 않는 이유.

## 상자 속 다른 도구

- [이미지 크기 조절](https://abox.tools/ko/이미지-크기-조절/): 크기를 말하고, 상자를 그리고, 형식을 고르세요.
- [HEIC를 JPG로](https://abox.tools/ko/heic-jpg-변환/): 아이폰이 만드는 사진을, 아무 데서나 열리는 형식으로.
- [증명사진 만들기](https://abox.tools/ko/증명사진-만들기/): 나라를 고르세요. 그 나라의 규정을 그대로 적용합니다.
- [이미지 스택](https://abox.tools/ko/이미지-스택/): 스무 장을 한 장으로. 스무 번의 업로드도, RAW 변환기도 없이.

## 자주 묻는 질문

### 제 이미지가 어딘가로 업로드되나요?

아닙니다. 파일을 디코딩하고 압축하고 재는 일은 전부 내 브라우저가 내 기기의 성능으로 합니다. 브라우저에 이미 들어 있는 JPEG, PNG, WebP 인코더를 쓰고요. 이 도구에는 네트워크 기능이 아예 없어서 무언가를 가져오지도, 보내지도 않습니다. 이 페이지의 `Content-Security-Policy`에 연결해도 되는 주소가 전부 적혀 있는데, 그중 이 사이트 것은 하나도 없습니다.

### 어떻게 정확한 용량에 맞추나요?

해 보면서 찾습니다. 화질 설정을 바이트 수로 바꿔 주는 공식은 없습니다. 사진마다 완전히 다르니까요. 그래서 이미지를 여러 번 인코딩하며 답을 찾습니다. 화질 범위의 맨 위에서 시작해 절반씩 좁혀 가는데, 이렇게 하면 여덟 번쯤 인코딩해서 들어맞는 가장 높은 화질에 닿습니다. 페이지에 보이는 용량은 전부 실제로 인코딩한 파일의 용량이지 추정치가 아닙니다.

### 여기서 말하는 "손실 최소"란 정확히 무슨 뜻인가요?

세 가지입니다. 첫째, 목표보다 이미 작은 이미지는 다시 인코딩하지 않고 바이트 그대로 통과시킵니다. 둘째, 해상도보다 화질을 먼저 쓰되 압축 흔적이 보이기 시작하는 선까지만 씁니다. 그 아래로는 사진을 작게 줄이고 화질을 도로 올립니다. 망가진 픽셀이 많은 것보다 멀쩡한 픽셀이 적은 편이 보기 좋으니까요. 셋째, 들어맞는 결과를 찾은 뒤에도 남은 용량을 다 쓸 때까지 화질을 도로 밀어 올립니다. 500KB를 요청했는데 300KB짜리를 돌려받는 일은 없습니다.

### 결과마다 붙는 SSIM과 PSNR 수치는 무엇인가요?

압축이 무엇을 대가로 치렀는지 잰 값입니다. 결과물을 다시 디코딩해서 원본 사진과 비교합니다. SSIM은 국소적인 밝기와 대비, 구조를 비교하는데, 바뀐 픽셀 수를 세는 것보다 사람 눈이 거슬려 하는 지점에 훨씬 가깝습니다. 0.98쯤을 넘으면 나란히 놓고도 구별하기 어렵습니다. PSNR은 전통적인 데시벨 수치고요. 둘 다 내 기기에서 계산해 화면에 그대로 띄웁니다. 손실이 적다는 말이 주장이 아니라 확인할 수 있는 사실이 되도록요.

### 어떤 형식을 읽고 쓸 수 있나요?

브라우저가 디코딩할 수 있는 것은 다 읽습니다. 실제로는 JPEG, PNG, WebP, GIF, BMP이고, 요즘 브라우저 대부분에서는 AVIF까지 읽습니다. 쓰는 쪽은 JPEG, PNG, WebP인데, 브라우저에 들어 있는 인코더가 그것뿐이기 때문입니다. "자동"으로 두면 파일이 들어온 형식을 그대로 유지하고, 그대로 두면 크기를 줄이거나 화질을 눈에 띄게 떨어뜨려야 하는 경우에만 WebP로 바꿉니다.

### PNG는 왜 많이 압축되지 않나요?

PNG는 무손실이라 돌릴 화질 다이얼이 아예 없기 때문입니다. PNG를 작게 만드는 방법은 픽셀을 줄이거나 색을 줄이는 것뿐이라, PNG를 고르면 크기 조절만으로 목표에 닿습니다. 사진이라면 JPEG나 WebP가 보기에 멀쩡한 화질로 목표에 훨씬 가까이 갑니다. 로고나 투명 배경이 있는 스크린샷이라면 WebP가 그 투명도를 지켜 주고요. JPEG는 흰색으로 메워 버립니다.

### 이미지를 압축하면 EXIF와 GPS 정보도 지워지나요?

네, 부수적으로 지워집니다. 압축한다는 것은 사진을 픽셀로 디코딩했다가 그 픽셀을 다시 인코딩한다는 뜻인데, 픽셀로 가득한 캔버스에는 태그가 붙어 있지 않습니다. 그래서 위치, 카메라 모델, 촬영 시각을 비롯한 모든 정보가 새 파일에는 애초에 쓰이지 않습니다. 메타데이터만 없애고 사진은 그대로 두고 싶다면 [EXIF 확인 및 제거](https://abox.tools/ko/exif-정보-삭제/)를 쓰세요. 다시 압축하지 않고 컨테이너만 새로 씁니다.

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

무료이고 계정도, 로그인도, 체험판도, 워터마크도 없습니다. 파일 개수나 용량 제한도 없습니다. 그 값을 치를 서버가 없으니까요. 작업은 내 기기에서 일어납니다. 이 사이트는 광고로 유지되는데, 그 광고에도 내 사진에 관한 것은 넘어가지 않습니다.

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

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

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

- **이미지는 나갈 곳이 없습니다.** 이 페이지가 연결해도 되는 주소는 Content-Security-Policy에 모두 적혀 있는데, 그중 이 사이트 것은 하나도 없습니다. 파일이 모일 만한 수신 지점이 없고, 설령 있더라도 거기로 파일을 보낼 코드가 없습니다.
- **여기서는 아무것도 가져오지 않습니다.** `src/` 어디에도 `fetch`도, `XMLHttpRequest`도, `sendBeacon`도 없습니다. 압축은 `canvas.toBlob`이 합니다. 브라우저에 이미 설치되어 있는 인코더예요.
- **숫자는 재서 보여 줄 뿐, 어디로도 보내지 않습니다.** 용량도, 화질 수치도, SSIM 비교도 모두 이 페이지에서 계산해 화면에 띄웁니다. 이 저장소에는 파일 이름이나 용량, 개수, 결과를 실어 보내는 분석 이벤트가 하나도 없습니다.
- **구글이 불러오는 것과, 구글에게 주지 않는 것.** 광고와 측정 스크립트는 구글에서, 후원 버튼은 Buy Me a Coffee에서 옵니다. 어느 쪽에도 내 사진에 관한 것은 넘어가지 않습니다. 파일을 읽고 압축하고 재는 코드는 한 줄도 빠짐없이 이 출처에서 제공되고 저장소에 공개되어 있습니다.
- **오프라인에서도 동작합니다.** 네트워크를 끊어도 도구는 그대로입니다. 애초에 네트워크를 쓰는 단계가 없었으니까요. 가장 간단한 증거입니다.

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

먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 `config/site.toml`, 화질을 어디까지 쓸지 정하는 탐색은 `src/compress.js`, '육안 일치' 수치 뒤의 비교는 `src/measure.js`에 있습니다.
