# Cara kerja Resizo

## Pemrosesan di browser

Saat pengguna menjatuhkan gambar ke Resizo, file dibaca ke memori menggunakan API `FileReader` dan `Blob`. Bitmap didekode menjadi `HTMLImageElement` atau `ImageBitmap`, digambar pada `<canvas>` dengan dimensi target, dan dikodekan ulang dengan `canvas.toBlob()`. Blob yang dihasilkan ditawarkan sebagai unduhan melalui object URL. File tidak pernah melewati batas jaringan.

Untuk pekerjaan batch, Resizo menggunakan pool `Web Worker` untuk memproses beberapa gambar secara paralel tanpa memblokir UI, lalu menggabungkan keluaran menjadi ZIP menggunakan encoder ZIP sisi klien. ZIP juga dibuat di memori dan langsung diunduh.

## Model privasi

- **Tanpa upload.** Tidak ada endpoint sisi server yang menerima data gambar.
- **Tanpa persistensi.** Gambar hanya ada di tab browser aktif. Menutup atau memuat ulang tab akan menghapusnya.
- **Tanpa telemetri pada konten file.** Resizo tidak mengirim nama file, dimensi, atau metadata ke layanan analitik mana pun.
- **Bekerja offline.** Setelah halaman pertama dimuat, situs berfungsi tanpa koneksi jaringan.
- **Perilaku terbuka.** Semua pemrosesan adalah JavaScript biasa yang terlihat di kode sumber halaman; aktivitas jaringan dapat diverifikasi dengan tab Network di DevTools browser (tetap kosong selama pengeditan).

## Format yang didukung

| Format | Input | Output | Catatan |
| --- | --- | --- | --- |
| JPG / JPEG | Ya | Ya | Lossy. Terbaik untuk foto. Slider kualitas 1–100. |
| PNG | Ya | Ya | Lossless. Mendukung transparansi. File lebih besar. |
| WebP | Ya | Ya | Format modern, ~25–35% lebih kecil dari JPG pada kualitas yang sama. |
| GIF | Ya | Tidak (ekspor sebagai PNG/JPG/WebP) | Frame pertama digunakan; animasi tidak dipertahankan. |
| HEIC / HEIF | Bergantung browser | Tidak | Safari mendekode secara native; browser lain memerlukan konversi terlebih dahulu. |
| SVG | Tidak | Tidak | Format vektor; mengubah ukuran adalah perubahan viewBox, bukan operasi raster. |

## Kualitas dan interpolasi

Pengubahan ukuran di Canvas API diatur oleh dua pengaturan yang dipaparkan Resizo:

- `imageSmoothingEnabled` — diatur ke `true` untuk foto agar tepi diinterpolasi; diatur ke `false` untuk pixel art dan tangkapan layar agar tepi keras tetap tajam.
- `imageSmoothingQuality` — `"high"` adalah default, yang memilih kernel resampling orde lebih tinggi (didefinisikan oleh implementasi browser, biasanya Lanczos atau bicubic). `"medium"` dan `"low"` menukar kualitas dengan kecepatan saat pekerjaan batch besar.

Untuk pengecilan besar (lebih dari ~3×), Resizo melakukan pengubahan ukuran dalam dua tahap untuk mengurangi aliasing. Output JPG dan WebP menggunakan nilai kualitas yang dikontrol pengguna; PNG menggunakan DEFLATE lossless.
