# Jinsi Resizo Inavyofanya Kazi

## Uchakataji ndani ya kivinjari

Mtumiaji anapodondosha picha kwenye Resizo, faili husomwa kwenye kumbukumbu kwa kutumia API za `FileReader` na `Blob`. Bitmap hudekodiwa kuwa `HTMLImageElement` au `ImageBitmap`, huchorwa kwenye `<canvas>` kwa vipimo vinavyolengwa, kisha hupewa msimbo upya kwa `canvas.toBlob()`. Blob inayotokana hutolewa kama kipakuliwa kupitia object URL. Faili haivuki kamwe mpaka wa mtandao.

Kwa kazi za bechi, Resizo hutumia kundi la `Web Worker` kuchakata picha kadhaa kwa pamoja bila kuzuia UI, kisha huunganisha matokeo kuwa ZIP kwa kutumia encoder ya ZIP upande wa mteja. ZIP pia hutengenezwa kwenye kumbukumbu na kupakuliwa moja kwa moja.

## Mfumo wa faragha

- **Hakuna upload.** Hakuna endpoint upande wa seva inayopokea data ya picha.
- **Hakuna kuhifadhi.** Picha hubaki tu kwenye kichupo cha kivinjari kilichofunguliwa. Kufunga au kuburudisha kichupo huzifuta.
- **Hakuna telemetry kuhusu maudhui ya faili.** Resizo haitumi majina ya faili, vipimo, wala metadata kwa huduma yoyote ya uchanganuzi.
- **Inafanya kazi nje ya mtandao.** Baada ya kupakia ukurasa kwa mara ya kwanza, tovuti hufanya kazi hata bila muunganisho wa mtandao.
- **Tabia iliyo wazi.** Uchakataji wote ni JavaScript ya kawaida inayoonekana kwenye chanzo cha ukurasa; shughuli za mtandao zinaweza kuthibitishwa kupitia kichupo cha Network cha DevTools cha kivinjari (kinabaki tupu wakati wa kuhariri).

## Fomati zinazoungwa mkono

| Fomati | Ingizo | Tokeo | Maelezo |
| --- | --- | --- | --- |
| JPG / JPEG | Ndiyo | Ndiyo | Hupoteza ubora. Bora kwa picha za kawaida. Kidhibiti cha ubora 1–100. |
| PNG | Ndiyo | Ndiyo | Bila kupoteza ubora. Inasaidia uwazi. Faili kubwa zaidi. |
| WebP | Ndiyo | Ndiyo | Fomati ya kisasa, ndogo kwa ~25–35% kuliko JPG kwa ubora sawa. |
| GIF | Ndiyo | La (huhamishiwa kama PNG/JPG/WebP) | Fremu ya kwanza hutumika; mwendo hauhifadhiwi. |
| HEIC / HEIF | Inategemea kivinjari | La | Safari hudekodi kwa asili; vivinjari vingine vinahitaji ubadilishaji wa awali. |
| SVG | La | La | Fomati ya vekta; kubadilisha ukubwa ni mabadiliko ya viewBox, sio operesheni ya raster. |

## Ubora na interpolation

Kubadilisha ukubwa kwenye Canvas API hudhibitiwa na mipangilio miwili ambayo Resizo huiweka wazi:

- `imageSmoothingEnabled` — wekwa kuwa `true` kwa picha ili kingo ziwe na interpolation; wekwa kuwa `false` kwa pixel art na picha za skrini ili kingo ngumu zibaki kali.
- `imageSmoothingQuality` — `"high"` ndio chaguo-msingi, ambacho huchagua kerneli ya resampling ya daraja la juu (hufafanuliwa na utekelezaji wa kivinjari, kawaida Lanczos au bicubic). `"medium"` na `"low"` hubadilisha ubora kwa kasi wakati wa kazi kubwa za bechi.

Kwa kupunguza ukubwa kwa kiasi kikubwa (zaidi ya ~3×), Resizo hufanya ubadilishaji wa ukubwa kwa hatua mbili ili kupunguza aliasing. Matokeo ya JPG na WebP hutumia thamani ya ubora inayodhibitiwa na mtumiaji; PNG hutumia DEFLATE bila kupoteza ubora.
