# Resizo 작동 방식

## 브라우저 내 처리

사용자가 Resizo에 이미지를 드롭하면 파일은 `FileReader` 및 `Blob` API를 사용해 메모리로 읽힙니다. 비트맵은 `HTMLImageElement` 또는 `ImageBitmap`으로 디코딩되고, 목표 치수의 `<canvas>`에 그려진 다음, `canvas.toBlob()`으로 다시 인코딩됩니다. 결과 blob은 object URL을 통해 다운로드로 제공됩니다. 파일은 네트워크 경계를 결코 넘지 않습니다.

배치 작업의 경우 Resizo는 `Web Worker` 풀을 사용해 UI를 차단하지 않고 여러 이미지를 병렬로 처리한 다음, 클라이언트 측 ZIP 인코더로 출력물을 하나의 ZIP으로 조립합니다. ZIP 또한 메모리에서 생성되어 직접 다운로드됩니다.

## 개인정보 보호 모델

- **업로드 없음.** 이미지 데이터를 수신하는 서버 측 엔드포인트가 존재하지 않습니다.
- **저장 없음.** 이미지는 활성 브라우저 탭에만 존재합니다. 탭을 닫거나 새로고침하면 사라집니다.
- **파일 콘텐츠에 대한 텔레메트리 없음.** Resizo는 파일명, 치수, 메타데이터를 어떤 분석 서비스에도 전송하지 않습니다.
- **오프라인에서 작동.** 첫 페이지 로드 이후에는 네트워크가 끊긴 상태에서도 사이트가 동작합니다.
- **개방적인 동작.** 모든 처리는 페이지 소스에서 볼 수 있는 평범한 JavaScript이며, 네트워크 활동은 브라우저 DevTools의 Network 탭에서 확인할 수 있습니다(편집 중에는 비어 있는 상태로 유지됩니다).

## 지원 형식

| 형식 | 입력 | 출력 | 비고 |
| --- | --- | --- | --- |
| JPG / JPEG | 예 | 예 | 손실 압축. 사진에 적합. 품질 슬라이더 1–100. |
| PNG | 예 | 예 | 무손실. 투명도 지원. 파일 용량이 더 큽니다. |
| WebP | 예 | 예 | 최신 형식, 동일 품질에서 JPG보다 약 25–35% 작습니다. |
| GIF | 예 | 아니요 (PNG/JPG/WebP로 내보냄) | 첫 프레임만 사용되며, 애니메이션은 보존되지 않습니다. |
| HEIC / HEIF | 브라우저 의존 | 아니요 | Safari는 네이티브 디코딩 지원, 다른 브라우저는 사전 변환 필요. |
| SVG | 아니요 | 아니요 | 벡터 형식이며, 리사이즈는 viewBox 변경이지 래스터 연산이 아닙니다. |

## 품질과 보간(Interpolation)

Canvas API에서의 리사이즈는 Resizo가 노출하는 두 가지 설정에 의해 결정됩니다:

- `imageSmoothingEnabled` — 사진의 경우 `true`로 설정해 가장자리가 보간되도록 하고, 픽셀 아트와 스크린샷의 경우 `false`로 설정해 단단한 가장자리가 또렷하게 유지되도록 합니다.
- `imageSmoothingQuality` — 기본값은 `"high"`이며, 더 높은 차수의 리샘플링 커널을 선택합니다(브라우저 구현에 따라 정의되며, 일반적으로 Lanczos 또는 bicubic). `"medium"`과 `"low"`는 대규모 배치 작업 시 품질을 속도와 맞바꿉니다.

큰 폭의 축소(약 3× 이상)의 경우 Resizo는 앨리어싱을 줄이기 위해 두 번에 걸쳐 리사이즈를 수행합니다. JPG 및 WebP 출력은 사용자가 제어하는 품질 값을 사용하며, PNG는 무손실 DEFLATE를 사용합니다.
