위에서 파일을 고르면 바로 열립니다.준비됨 — 인터넷을 끊어도 이대로 동작합니다.이 브라우저에서는 쓸 수 없습니다 (나머지는 그대로 동작합니다).오프라인 저장에는 https:// 또는 localhost가 필요합니다.여기서는 저장할 수 없지만, 어느 쪽이든 올라가는 것은 없습니다.파일은 어디로도 가지 않았습니다. 파일 {total}개를 불러왔고 모두 이 사이트의 것입니다. {platform}무언가가 {hosts}에 접속했는데, 이 도구는 절대 그러지 않습니다. 살펴볼 만합니다. {platform}광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 파일이나 그 1바이트도 받지 않았습니다.광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 파일이나 그 1바이트도 받지 않았습니다.문제가 생겼습니다: {detail}. 처음부터 다시 하려면 페이지를 새로 고치세요.파일 {count}개를 읽는 중…파일 {count}개를 읽는 중…예시로 해 보기예시를 만드는 중…이 브라우저에서는 예시를 만들지 못했습니다. 대신 파일을 골라 주세요.
압축은 내 브라우저가 내 기기의 성능으로, 브라우저에 이미 들어 있는 인코더를 써서 합니다. 이 도구에는 네트워크 기능이 아예 없습니다. 가져올 것도 보낼 것도 없어요. 설령 보내려 해도 이 페이지 반대편에는 사진을 받아 줄 서버가 없습니다.
✗ 업로드 없음
✗ 가입 없음
✗ 용량 제한 없음
✓ 오프라인 동작
✓ 오픈 소스
실시간 확인:확인 중…
오프라인:확인 중…
그냥 믿지 마시고 직접 확인해 보세요. 개발자 도구의 '네트워크' 탭을 켜 놓고 사진을 압축해 보십시오. 이미지도, 미리보기도, 파일 이름도, 고른 파일의 단 1바이트도 실려 나가는 요청이 없습니다. 아니면 인터넷을 끊고 그냥 압축해 보셔도 됩니다.
이 약속을 직접 확인하는 방법
이미지는 나갈 곳이 없습니다. 이 페이지가 연결해도 되는 주소는 Content-Security-Policy에 모두 적혀 있는데, 그중 이 사이트 것은 하나도 없습니다. 파일이 모일 만한 수신 지점이 없고, 설령 있더라도 거기로 파일을 보낼 코드가 없습니다.
여기서는 아무것도 가져오지 않습니다.src/ 어디에도 fetch도, XMLHttpRequest도, sendBeacon도 없습니다. 압축은 canvas.toBlob이 합니다. 브라우저에 이미 설치되어 있는 인코더예요.
숫자는 재서 보여 줄 뿐, 어디로도 보내지 않습니다. 용량도, 화질 수치도, SSIM 비교도 모두 이 페이지에서 계산해 화면에 띄웁니다. 이 저장소에는 파일 이름이나 용량, 개수, 결과를 실어 보내는 분석 이벤트가 하나도 없습니다.
구글이 불러오는 것과, 구글에게 주지 않는 것. 광고와 측정 스크립트는 구글에서, 후원 버튼은 Buy Me a Coffee에서 옵니다. 어느 쪽에도 내 사진에 관한 것은 넘어가지 않습니다. 파일을 읽고 압축하고 재는 코드는 한 줄도 빠짐없이 이 출처에서 제공되고 저장소에 공개되어 있습니다.
오프라인에서도 동작합니다. 네트워크를 끊어도 도구는 그대로입니다. 애초에 네트워크를 쓰는 단계가 없었으니까요. 가장 간단한 증거입니다.
직접 확인해 보세요. 위에 적은 어느 것도 그냥 믿으실 필요는 없습니다. 이 페이지는 저장소 안의 템플릿과 설정을 빌드 스크립트가 찍어 낸 결과이고, 그 스크립트는 누구나 읽고 직접 돌려 볼 수 있습니다. 결과물은 dist 브랜치에 그대로 올라가 있고요. 그래서 실제로 제공되는 파일과 소스를 빌드한 결과를 나란히 놓고 비교해 보실 수 있습니다:
먼저 읽어 볼 파일을 꼽자면, Content-Security-Policy는 config/site.toml, 화질을 어디까지 쓸지 정하는 탐색은 src/compress.js, '육안 일치' 수치 뒤의 비교는 src/measure.js에 있습니다.
회사 보안 소프트웨어가 업로드를 경고한다면. 그것은 브라우저에서 파일이 선택되는 순간을 지켜보며, 페이지가 그것을 보낼 생각인지는 알 수 없습니다 — 그래서 고르는 순간에 경고합니다. 여기서는 아무것도 보내지 않습니다. 브라우저 개발자 도구를 열고 네트워크 탭으로 옮긴 뒤 파일을 골라 보세요. 그것을 실어 나르는 요청은 없고, 이 페이지 자체의 로컬 미리보기 말고는 요청 자체가 없습니다. 같은 확인을 IT 팀도 삼십 초면 할 수 있습니다.
1 이미지 고르기
2 얼마까지 허용할지 말하기
다른 압축 도구들이 거꾸로 하고 있는 부분입니다. 화질 슬라이더만 던져 주고, 어느 눈금이 정해진 한도 아래로 떨어지는지는 알아서 짐작하라고 하니까요. 여기서는 한도를 말해 주시면 됩니다. 그 안에 들어가는 가장 높은 화질을 찾아내고, 요청한 용량의 절반짜리를 돌려주는 대신 남은 용량까지 마저 씁니다.
필요하면 사진을 더 작게 만들어도 됨 화질만으로는 압축 흔적이 보이기 시작하는 선 아래까지 내려가야 할 때만 씁니다. 그 아래에서는 망가진 픽셀이 많은 것보다 멀쩡한 픽셀이 적은 편이 보기 좋으니까요. 이 항목을 끄면 가로세로는 그대로 지키고, 빠듯한 목표를 화질로 치릅니다.
3 압축
압축 완료
{amount}바이트{amount} KB{amount} MB이미지 {count}장, 모두 {size}이미지 {count}장, 모두 {size}이미 목표 아래입니다 — 이 장은 그대로 둡니다.{name}을(를) 목록에서 빼기{name}: 이 도구가 읽을 수 있는 이미지가 아닙니다.{name}: 이 브라우저가 디코딩하지 못했습니다.목표로 삼을 용량을 적으세요.모든 이미지를 {size} 아래로 내립니다.이 이미지는 {size}을(를) 넘으므로, 넘지 않을 때까지 압축합니다.이 이미지는 이미 {size} 아래여서 손대지 않고 그대로 내보냅니다.{total}장 가운데 {over}장이 {size}을(를) 넘습니다{total}장 가운데 {over}장이 {size}을(를) 넘습니다나머지 한 장은 손대지 않고 그대로 내보냅니다나머지 {count}장은 손대지 않고 그대로 내보냅니다{over}.{over}, 그리고 {rest}.{format} {sizing}형식은 그대로 두되, 목표가 빠듯해서 그대로 두는 것이 실제 화질을 깎아먹는다면 WebP를 쓰고, 해당 줄이 그 사실을 밝힙니다.모든 이미지가 들어온 형식을 그대로 지킵니다.전부 JPEG으로 씁니다. JPEG에는 알파 채널이 없어서 투명한 부분은 흰색이 됩니다.전부 WebP로 씁니다. 같은 화질에서 JPEG보다 작고, 투명도도 지킵니다.전부 PNG로 씁니다. PNG에는 화질 조절이 없어서 목표에 닿는 길은 그림을 줄이는 것뿐입니다.화질만으로 목표에 닿지 못하면, 짓뭉개는 대신 그림을 줄입니다.그림은 원래 크기를 그대로 지키므로, 빠듯한 목표는 화질만으로 치러야 합니다.WebP — 이 브라우저는 지원하지 않습니다첫 번째가 끝나기 전에 멈췄습니다.{total}개 중 {done}개까지 하고 멈췄습니다. 끝난 것은 아래에 있습니다.{total}개 중 {at}번째: {name} — {step}읽는 중디코딩 중최고 화질에서 얼마나 드는지 보는 중들어가는 가장 큰 크기를 찾는 중화질 눈금을 훑는 중크기 줄이기가 꺼져 있어 화질 하한 아래로 내려가는 중해상도를 화질과 맞바꾸는 중예산에 남은 만큼 쓰는 중대신 {format}(으)로 해 보는 중너무 여러 번 시도한 끝에 포기했습니다.이 브라우저가 {format}(으)로 인코딩하지 않았습니다.이 브라우저가 그림을 디코딩하지 못했습니다.{before}에서 {after}(으)로 — {change}, 그리고 모든 이미지가 목표 아래입니다.{before}에서 {after}(으)로. {count}장이 목표에 닿지 못했습니다 — 아래 줄을 보세요.{before}에서 {after}(으)로. {count}장이 목표에 닿지 못했습니다 — 아래 줄들을 보세요.{before} → {after} · {change}{size} — 이미 목표 아래여서 아무것도 손대지 않았습니다.원본과 견주어 측정: {match} (SSIM {ssim}, PSNR {psnr}).위 설정으로는 이 그림을 이보다 작게 만들 수 없었고, 아직 목표를 넘습니다. 크기 줄이기를 허용하거나, 더 큰 목표를 지정하세요.내려받기비교접기{percent}% 작아짐{percent}% 커짐거의 같은 크기{percent}% — 구별할 수 없음{percent}% — 눈에 띄는 차이 없음{percent}% — 매우 가까움{percent}% — 살짝 부드러워짐{percent}% — 압축이 눈에 보임{db} dB동일이미 가지고 있던 용량에 닿자고 압축하면 화질만 깎였을 것이므로, 메타데이터까지 그대로 바이트 단위로 통과시켰습니다.{format}, {size}, {encodes}.{format}, 품질 {quality}, {size}, {encodes}.{format}(으)로 저장{format}(으)로 저장. 이 용량에서는 원래 형식보다 그림을 더 잘 버텨 냈습니다{from}에서 {to}(으)로 줄임원래 크기 그대로 {size}{count}번 인코딩해서 찾음{count}번 인코딩해서 찾음원본압축본{label}: {name}{size} · {dimensions}둘 다 같은 너비로 보여 줍니다. 차이는 원래 그렇게 판단하는 것입니다. 가까이 보려면 두 파일을 실제 크기로 여세요.이미지는 어디로도 가지 않았습니다. 파일 {total}개를 불러왔고 모두 이 사이트의 것입니다. {platform}무언가가 {hosts}에 접속했는데, 이 도구는 절대 그러지 않습니다. 살펴볼 만합니다. {platform}광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 이미지나 그 1바이트도 받지 않았습니다.광고와 측정과 후원 버튼을 위한 이 사이트 자신의 스크립트가 호스트 {hosts}곳에서 왔습니다. 그중 어느 쪽도 이미지나 그 1바이트도 받지 않았습니다.
원하는 결과가 나왔나요?
무엇이 잘못됐나요?
고맙습니다 — 큰 도움이 됩니다.
보내지는 것은 답변뿐이고, 그것도 버튼을 눌렀을 때만입니다. 파일도, 파일 이름도, 파일에 관한 어떤 정보도 보내지 않습니다.
# 이미지 압축 — 원하는 용량에 정확히 맞추기
용량만 말씀하세요. 나머지는 알아서 맞춥니다.
> 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`에 있습니다.
이미지를 원하는 용량으로 압축하는 방법
이미지를 고릅니다. 선택 영역에 끌어다 놓거나 직접 골라 주세요. 브라우저가 디스크에서 곧바로 읽습니다. 그동안 어디로도 아무것도 나가지 않습니다.
맞추라고 들은 용량을 입력합니다. 사진을 계속 거부하는 업로드 양식이면 100KB, 지원서 포털이면 500KB, 빨리 떠야 하는 페이지면 2MB. 자주 쓰이는 네 가지는 버튼으로 두었습니다.
"목표 용량으로 압축"을 누릅니다. 들어맞는 가장 높은 화질을 좁혀 가는 동안 이미지는 여러 번 인코딩됩니다. 이미 목표보다 작은 파일은 손대지 않고 그대로 둡니다.
대가를 확인하고 내려받습니다. 결과마다 어떤 형식으로 썼는지, 화질은 얼마였는지, 가로세로가 바뀌었는지, 재 봤을 때 원본과 얼마나 가까운지가 적혀 있습니다. "비교"를 누르면 두 사진을 나란히 놓습니다.
자세한 설명
이미지를 정확한 용량으로 압축하는 방법업로드 양식은 500KB를 요구하는데 사진은 4MB입니다. 용량 제한이 실제로 무엇을 앗아 가는지, 어느 설정부터 움직여야 하는지, 그리고 PNG가 JPEG처럼 줄어들지 않는 이유.
아닙니다. 파일을 디코딩하고 압축하고 재는 일은 전부 내 브라우저가 내 기기의 성능으로 합니다. 브라우저에 이미 들어 있는 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 확인 및 제거를 쓰세요. 다시 압축하지 않고 컨테이너만 새로 씁니다.
무료인가요? 가입해야 하나요?
무료이고 계정도, 로그인도, 체험판도, 워터마크도 없습니다. 파일 개수나 용량 제한도 없습니다. 그 값을 치를 서버가 없으니까요. 작업은 내 기기에서 일어납니다. 이 사이트는 광고로 유지되는데, 그 광고에도 내 사진에 관한 것은 넘어가지 않습니다.
오프라인에서도 되나요?
됩니다. 페이지를 한 번 불러온 다음 인터넷을 끊어도 계속 동작합니다. 아무것도 업로드되지 않는다는 가장 간단한 증명이기도 하고요. 이미지를 어딘가로 보내서 압축하는 도구라면 선을 뽑는 순간 멈춰 버릴 테니까요.