LeanImg

Scaler de imagine: vrei un upscaler sau un resizer?

Un resizer interpolează pixeli, iar un upscaler îi reconstruește. Pe care îl ai nevoie, cu rezultate măsurate de 2x și 4x și limitele reale ale browserului.

"Scaler de imagine" acoperă două instrumente care fac lucruri opuse unui fișier. Un resizer resamplează pixeli pe care îi ai deja, astfel încât 4000 px lățime devine 1080 px lățime, iar detaliile sunt mediate în mai puține mostre. Un upscaler rulează imaginea printr-un model antrenat care reconstruește marginile și textura pe care originalul nu le-a stocat niciodată. Ambele schimbă numărul din caseta de dimensiuni. Numai unul dintre ele poate adăuga detalii, și oferă doar 2x sau 4x.

Ambele funcționează în interiorul tab-ului browserului. Upscalerul își descarcă modelul pe mașina ta o dată, apoi fiecare tile după aceea este calculat pe GPU-ul tău. Nimic nu este postat nicăieri, deoarece nu există o rută API pentru a posta și nicio acțiune pe server în baza de cod (asta este întreaga arhitectură, descrisă pe pagina noastră de confidențialitate). Orice alt scaler din această categorie încarcă fișierul tău și apoi promite să-l șteargă într-o oră sau două.

Care este diferența dintre redimensionare și upscaling?

Redimensionarea este interpolare. Resizerul nostru predă munca browserului, fie prin createImageBitmap cu `resizeQuality: "high"`, fie printr-un canvas `drawImage` cu imageSmoothingQuality setat pe înalt. În orice caz, pixelul de ieșire este o medie ponderată a pixelilor de intrare din jurul său. Averaging nu poate produce o margine care nu era în datele sursă, astfel încât mărirea prin interpolare îți oferă o copie mai mare, mai moale a aceleași informații.

Upscaling-ul este reconstrucție. Al nostru rulează Real-ESRGAN realesr-general-x4v3, un model generativ antrenat să halucineze detalii plauzibile la 4x, descris în lucrarea din 2021. Procesează imaginea în tile-uri de 256 px cu o suprapunere de 16 px pe fiecare parte, astfel încât un tile vede întotdeauna contextul vecinilor săi înainte ca regiunea principală să fie scrisă. Modelul ghicește. Aceste ghiciri sunt de obicei corecte pe fețe, țesături și text, și pot fi complet greșite pe modele fine repetitive.

Pe care ar trebui să-l aleg?

Dacă dimensiunea țintă este mai mică decât sursa, ai nevoie de resizer și nu este nimic de discutat. Dacă ținta este mai mare, întrebarea este dacă îți poți permite constrângerile de mai jos. Iată ce fac cele două instrumente în construcția noastră, preluate din cod mai degrabă decât din textul de marketing.

ResizerUpscaler
DirecțieOrice dimensiune țintă, în sus sau în josDoar 2x sau 4x
MetodăInterpolare canvas browserReal-ESRGAN realesr-general-x4v3
Format de ieșireFormatul sursă păstrat (GIF și AVIF ies ca PNG)Întotdeauna PNG
Controlul calitățiiPNG fără pierderi, tot restul re-encodat la calitate 90Niciunul, PNG nu are un dial de calitate
Limită de lot10 fișiere, 50 MB total1 fișier
Plafon de intrareNumai plafonul de lotAproximativ 32 MP cu WebGPU, aproximativ 1.1 MP fără
Presetări15 dimensiuni sociale plus 25/50/75 procenteNiciuna, doar butoanele 2x și 4x

O linie merită un avertisment. Resizerul are setat implicit "nu mări" bifat, ceea ce limitează orice dimensiune țintă introdusă la dimensiunile originale. O presetare socială numită suprascrie această limitare intenționat, deoarece un cadru de poveste de 1080x1920 limitat nu se potrivește cu specificația niciunei platforme.

Cât de mult crește fișierul când fac upscaling?

Mult, iar PNG este motivul. Am rulat small.png, 400x269 și 177.1 KB, prin ambele setări. La 2x a ieșit 800x538 și 782.8 KB. La 4x a ieșit 1600x1076 și 2.7 MB. Asta este aproximativ 15x byte-urile de intrare pentru 16x pixelii, ceea ce este cum arată ieșirea fără pierderi atunci când modelul a umplut fiecare zonă plată cu nouă microtextură. Upscalerul scrie PNG în fiecare caz, astfel încât nu există un slider de calitate de schimbat.

Vedere divizată a unei imagini sursă de 400x269 și a rezultatului său upscaled de 800x538
small.png la 2x: 400x269 și 177.1 KB în, 800x538 și 782.8 KB ieșire. Rularea de 4x a aceluiași fișier ajunge la 1600x1076 și 2.7 MB.

Trimite rezultatul la compresor înainte de a-l folosi oriunde. Modului nostru PNG "fără compresie" este oxipng nivel 3, cu adevărat fără pierderi, și a redus un alpha.png de 942.4 KB la 383.9 KB. Modului paletă (imagequant) a dus același fișier la 98.3 KB, ceea ce este bine pentru grafica plată și greșit pentru un upscale fotografic.

De ce opțiunea 2x arată mai moale decât 4x?

Pentru că 2x nu este un model separat. realesr-general-x4v3 are exact un scalare de ieșire, și este 4x. Când alegi 2x, rulăm aceeași inferență și apoi redimensionăm fiecare tile înapoi la jumătate din dimensiune cu interpolatorul de canvas la calitate de netezire înaltă. Așadar, munca GPU este aceeași pentru ambele butoane, iar 2x este reconstrucție urmată de resampling în această ordine. Redimensionarea se face pe tile, ceea ce înseamnă că întreaga imagine de 4x nu există niciodată în memorie în timpul unei lucrări de 2x. Dacă vrei ieșirea brută a modelului, alege 4x și micșorează-o tu în resizer ulterior. Lățimea sursă de care are nevoie fiecare multiplicator pentru a ajunge la 3840 px este calculată separat.

De ce nu va accepta upscalerul fotografia mea de 24 MP?

Depinde în întregime de faptul dacă browserul tău pornește WebGPU. Cu WebGPU activat, o lucrare de 4x acceptă aproximativ 32 megapixeli de intrare. Fără el, onnxruntime-web revine la WASM pe fir unic și plafonul de intrare scade la aproximativ 1.1 megapixeli, mai mic decât aproape orice fotografie de telefon. Aceasta nu este o limită arbitrară. Inferența CPU pe acest model durează minute pe megapixel, iar o lucrare de 24 MP ar bloca tab-ul pentru restul după-amiezii. Un fișier pe rând, întotdeauna.

Ce altceva schimbă resizerul în afară de numărul de pixeli?

Mai mult decât se așteaptă oamenii. O sursă PNG rămâne PNG și rămâne fără pierderi. Tot restul este re-encodat, la calitate 90 în mod implicit, astfel încât redimensionarea unui JPEG este de asemenea o recompresie, fie că ai vrut sau nu. O sursă GIF iese ca PNG, iar dacă acel GIF a fost animat, pierzi fiecare cadru, cu excepția primului. Sursele AVIF ies de asemenea ca PNG. Cele trei moduri de ajustare contează atunci când raporturile de aspect sursă și țintă nu sunt de acord: acoperirea crop-urilor centrale, întinderea distorsionează și conținerea micșorează canvasul la zona ajustată mai degrabă decât să-l umple cu bare. Dacă ai nevoie de o regiune specifică mai degrabă decât de o dimensiune specifică, croitorul este instrumentul potrivit, deși ia un fișier pe rând și re-encodează formatele cu pierderi la o calitate hardcoded de 92.

Deci, ce ar trebui să fac acum cu fișierul meu?

Verifică mai întâi marginea lungă. Sub aproximativ 1600 px și ai nevoie de el mai mare, deschide upscalerul, rulează 2x, apoi trece PNG-ul prin compresor în modul fără pierderi. Peste asta, sau deja la rezoluția de care ai nevoie, folosește resizerul și alege o presetare socială astfel încât să nu fie nevoie să cauți dimensiunile. Dacă ținta este un feed, cele patru forme acceptate de Instagram și plafonul de 1080 px din spatele lor este lista de la care să lucrezi.