Upscaling delle immagini web per display Retina: guida per sviluppatori
I display Retina e ad alta risoluzione richiedono immagini a risoluzione maggiore. Scopri come l'upscaling IA aiuta gli sviluppatori web a offrire immagini nitide a tutti gli utenti.

Founder of VectoSolve
Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.
How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author
Key Takeaways
- I display Retina moderni hanno una densità di 2x–3x, il che significa che un'immagine CSS da 300px necessita di un file sorgente da 600–900px per apparire nitida
-
Gli attributi HTML
srcsetesizespermettono ai browser di scegliere automaticamente la risoluzione ottimale, risparmiando banda sugli schermi a basso DPI - SVG è sempre preferibile per icone, loghi e illustrazioni geometriche perché scala all'infinito senza perdita di qualità
- Un pipeline di ottimizzazione immagini (ridimensionare → comprimere → convertire in WebP/AVIF → servire via CDN) può ridurre il peso della pagina del 60–80%
- Lighthouse penalizza pesantemente le immagini sovradimensionate; immagini responsive correttamente dimensionate possono aumentare il punteggio Performance di 10–20 punti
Se avete mai zoomato su un sito web dal vostro MacBook Pro o iPhone e notato che alcune immagini appaiono nitide mentre altre sembrano sfocate, avete assistito al problema dei display Retina in prima persona. Come sviluppatori frontend, consegniamo pixel — e nel 2025, la maggior parte di questi pixel atterra su schermi con device pixel ratio ben superiori a 1.0.
Questa guida copre tutto ciò che dovete sapere: cosa significa realmente il device pixel ratio, come servire l'immagine giusta allo schermo giusto, quando saltare il raster e usare SVG, e come costruire un pipeline di ottimizzazione che mantiene il vostro punteggio Lighthouse nel verde.
Capire il Device Pixel Ratio (DPR)
Il Device Pixel Ratio è la relazione tra i pixel CSS (le unità logiche che scriviamo nei nostri fogli di stile) e i pixel fisici del dispositivo (i punti hardware effettivi sullo schermo). Un DPR di 2 significa che ogni singolo pixel CSS corrisponde a una griglia 2×2 di pixel fisici — quattro volte più punti.
Valori DPR comuni per dispositivo
| Dispositivo | DPR | Risoluzione CSS | Risoluzione fisica |
|---|---|---|---|
| Monitor desktop standard | 1.0 | 1920×1080 | 1920×1080 |
| MacBook Pro 14" (2024) | 2.0 | 1512×982 | 3024×1964 |
| iPhone 15 Pro | 3.0 | 393×852 | 1179×2556 |
| Samsung Galaxy S24 | 2.625 | 384×854 | 1008×2244 |
| iPad Pro 12.9" | 2.0 | 1024×1366 | 2048×2732 |
Come verificare il proprio DPR: Aprite la console del browser e digitate window.devicePixelRatio. Sulla maggior parte dei laptop e telefoni moderni, vedrete un valore tra 2.0 e 3.0. Questo singolo numero determina se le vostre immagini appaiono ultra-nitide o deludentemente sfocate.
L'implicazione pratica è semplice ma profonda: se mostrate un <img> a 400×300 pixel CSS su uno schermo 2x, il browser stira un'immagine sorgente 400×300 su 800×600 pixel fisici. Il risultato è quell'aspetto "morbido" caratteristico — tecnicamente corretto, ma visibilmente inferiore a un'immagine nativamente nitida.
La matematica dietro le immagini Retina-Ready
Per servire un'immagine pixel-perfect a qualsiasi DPR, moltiplicate le dimensioni di visualizzazione CSS per il DPR:
Larghezza sorgente = Larghezza visualizzazione CSS × DPR
Altezza sorgente = Altezza visualizzazione CSS × DPR
Per un banner hero visualizzato a 1200×600 pixel CSS:
- Schermo 1x: sorgente 1200×600px (mappatura 1:1)
- Schermo 2x: sorgente 2400×1200px (4× il numero di pixel)
- Schermo 3x: sorgente 3600×1800px (9× il numero di pixel)
Warning: Non servite ciecamente immagini 3x a tutti. Un'immagine hero 3600×1800 può facilmente pesare 800KB+ anche dopo la compressione. L'attributo srcset esiste specificamente per evitare questa penalità di banda sugli schermi a basso DPI. Fornite sempre risoluzioni multiple e lasciate scegliere al browser.
Immagini responsive con srcset e sizes
L'attributo HTML srcset è la pietra angolare delle immagini responsive Retina-ready. Fornisce al browser un menu di file immagine a diverse risoluzioni, e il browser seleziona il più appropriato in base al DPR del dispositivo e alla dimensione del viewport.
srcset base con descrittori di larghezza
<img
src="/images/hero-800w.jpg"
srcset="
/images/hero-400w.jpg 400w,
/images/hero-800w.jpg 800w,
/images/hero-1200w.jpg 1200w,
/images/hero-1600w.jpg 1600w,
/images/hero-2400w.jpg 2400w
"
sizes="
(max-width: 640px) 100vw,
(max-width: 1024px) 75vw,
50vw
"
alt="Immagine hero presentazione prodotto"
width="1200"
height="600"
loading="lazy"
decoding="async"
/>
Analizziamo cosa sta succedendo:
srcsetelenca ogni file immagine seguito dalla sua larghezza intrinseca (il descrittorew). Il browser ora sa esattamente quanti pixel contiene ogni file.sizesindica al browser quanto sarà larga l'immagine renderizzata ai vari breakpoint. Su schermi fino a 640px di larghezza, l'immagine riempie l'intero viewport (100vw). Su tablet, 75%. Su desktop, 50%.- Il browser combina
sizescondevicePixelRatioper calcolare la larghezza sorgente ideale, poi sceglie la corrispondenza più vicina dasrcset.
Pro Tip: Consiglio pro: Includete sempre gli attributi width e height nei vostri tag <img>. Questo permette al browser di calcolare il rapporto d'aspetto prima del caricamento dell'immagine, prevenendo il Cumulative Layout Shift (CLS) — un Core Web Vital che impatta direttamente il vostro ranking SEO.
Usare srcset con descrittori di densità pixel
Per immagini a dimensione fissa (come avatar o icone), potete usare il descrittore x:
<!-- Avatar a dimensione fissa: sempre 48×48 pixel CSS -->
<img
src="/avatars/user-48.png"
srcset="
/avatars/user-48.png 1x,
/avatars/user-96.png 2x,
/avatars/user-144.png 3x
"
alt="Avatar utente"
width="48"
height="48"
/>
Questo approccio è più pulito per elementi a dimensione fissa perché non servono l'attributo sizes. Il browser semplicemente abbina il descrittore al suo DPR.
L'elemento <picture> per la direzione artistica
A volte servono più del semplice cambio di risoluzione — servono ritagli o formati completamente diversi per contesti diversi. È qui che entra <picture>:
<picture>
<!-- AVIF per browser compatibili (migliore compressione) -->
<source
type="image/avif"
srcset="
/images/hero-800w.avif 800w,
/images/hero-1600w.avif 1600w,
/images/hero-2400w.avif 2400w
"
sizes="(max-width: 1024px) 100vw, 50vw"
/>
<!-- WebP come fallback -->
<source
type="image/webp"
srcset="
/images/hero-800w.png 800w,
/images/hero-1600w.png 1600w,
/images/hero-2400w.png 2400w
"
sizes="(max-width: 1024px) 100vw, 50vw"
/>
<!-- JPEG come fallback per browser datati -->
<img
src="/images/hero-800w.jpg"
srcset="
/images/hero-800w.jpg 800w,
/images/hero-1600w.jpg 1600w,
/images/hero-2400w.jpg 2400w
"
sizes="(max-width: 1024px) 100vw, 50vw"
alt="Presentazione prodotto"
width="1200"
height="600"
loading="lazy"
/>
</picture>
"L'immagine più veloce è quella perfettamente dimensionata per il dispositivo che la visualizza — non un pixel in più, non un pixel in meno.
Quando SVG è meglio dell'upscaling
Prima di investire tempo a generare varianti raster 2x e 3x, chiedetevi: questa immagine deve davvero essere raster? Per molti elementi di interfaccia comuni, SVG è la scelta oggettivamente superiore.
SVG vs Raster: un framework decisionale
| Criterio | Usare SVG | Usare Raster (con srcset) |
|---|---|---|
| Icone ed elementi di interfaccia | Sempre | Mai |
| Loghi e marchi | Sempre | Solo se estremamente complessi |
| Grafici e visualizzazioni | Preferibile | Solo per render molto complessi |
| Illustrazioni (flat/geometriche) | Preferibile | Se servono texture fotorealistiche |
| Fotografia | Mai | Sempre |
| Screenshot | Mai | Sempre |
| Gradienti/filtri complessi | A volte | Preferibile per effetti pesanti |
Confronto dimensioni file: Un'icona tipica come PNG 3x può pesare 5–15KB. La stessa icona come SVG ottimizzato è spesso 500 byte a 2KB — e appare perfetta su ogni DPR, inclusi futuri display 4x e 5x. SVG è il formato definitivo a prova di Retina per contenuto vettoriale.
SVG inline per massime prestazioni
Per icone UI critiche, SVG inline elimina completamente una richiesta HTTP:
<!-- Icona SVG inline — zero richieste di rete, rendering istantaneo -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"
width="24" height="24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"/>
<path d="M21 21l-4.35-4.35"/>
</svg>
Poiché SVG usa currentColor, l'icona eredita automaticamente il colore del testo dell'elemento genitore — perfetto per la tematizzazione e il supporto dark mode.
A Full Year of Conversions for $49
Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime
Get the Annual DealCostruire un pipeline di ottimizzazione immagini
Servire immagini Retina-ready senza un pipeline di ottimizzazione è come comprare un'auto sportiva e riempirla di carburante scadente. Serve un processo sistematico che gestisce ridimensionamento, compressione, conversione di formato e consegna.
Il pipeline a quattro fasi
Fase 1: Preparazione delle sorgenti
Partite sempre dalla sorgente di massima qualità disponibile. Per la fotografia, significa il file originale della fotocamera o un'esportazione lossless. Per gli asset di design, esportate da Figma o Sketch a 3x o superiore.
Fase 2: Generazione multi-risoluzione
Generate varianti ai breakpoint standard. Un set comune è 400w, 800w, 1200w, 1600w e 2400w:
/* Esempio: CSS per un hero responsive con background-image */
.hero {
background-image: url("/images/hero-1200w.png");
background-size: cover;
background-position: center;
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
.hero {
background-image: url("/images/hero-2400w.png");
}
}
/* Per le immagini di sfondo, le media query sono l'unico modo
per servire varianti adattate al DPR */
Fase 3: Conversione formato e compressione
Convertite ogni variante nei formati moderni. L'ordine di priorità è:
- AVIF — Migliore compressione (30–50% più piccolo di WebP), supporto browser in crescita
- WebP — Eccellente compressione, supporto browser quasi universale
- JPEG/PNG — Fallback per browser datati
Pro Tip: Automazione con Sharp (Node.js): La libreria Sharp è lo standard per l'elaborazione immagini lato server. Ecco un pattern pratico di build script:
<!-- Il risultato nel vostro HTML dopo l'elaborazione del pipeline -->
<picture>
<source type="image/avif" srcset="/img/photo.avif" />
<source type="image/webp" srcset="/img/photo.png" />
<img src="/img/photo.jpg" alt="Foto ottimizzata" />
</picture>
Fase 4: Consegna via CDN
Servite le immagini da un CDN con cache edge. Molti CDN (Cloudflare, Vercel, Imgix) offrono trasformazione immagini al volo, che può sostituire completamente le fasi 2 e 3:
<!-- Cloudflare Image Resizing -->
<img
src="/cdn-cgi/image/width=800,format=auto,quality=80/images/hero.jpg"
srcset="
/cdn-cgi/image/width=400,format=auto,quality=80/images/hero.jpg 400w,
/cdn-cgi/image/width=800,format=auto,quality=80/images/hero.jpg 800w,
/cdn-cgi/image/width=1200,format=auto,quality=80/images/hero.jpg 1200w,
/cdn-cgi/image/width=2400,format=auto,quality=80/images/hero.jpg 2400w
"
sizes="(max-width: 768px) 100vw, 50vw"
alt="Hero ottimizzato via CDN"
/>
Componente Image di Next.js: l'approccio moderno
Se lavorate su un progetto Next.js, il componente <Image> integrato gestisce automaticamente la maggior parte delle preoccupazioni Retina. È il più grande miglioramento di qualità di vita per la gestione immagini in React.
Uso base
<!-- Next.js genera automaticamente srcset con
risoluzioni multiple e serve WebP/AVIF -->
<img
src="/_next/image?url=%2Fimages%2Fhero.jpg&w=1200&q=75"
srcset="
/_next/image?url=%2Fimages%2Fhero.jpg&w=640&q=75 640w,
/_next/image?url=%2Fimages%2Fhero.jpg&w=750&q=75 750w,
/_next/image?url=%2Fimages%2Fhero.jpg&w=828&q=75 828w,
/_next/image?url=%2Fimages%2Fhero.jpg&w=1080&q=75 1080w,
/_next/image?url=%2Fimages%2Fhero.jpg&w=1200&q=75 1200w
"
sizes="100vw"
alt="Immagine hero"
loading="lazy"
decoding="async"
/>
Configurazione avanzata
Personalizzate le dimensioni generate in next.config.js:
<!-- Cosa produce Next.js Image per un hero responsive -->
<!-- Con la prop priority per immagini LCP above-the-fold -->
<img
src="/_next/image?url=%2Fhero.jpg&w=3840&q=80"
srcset="
/_next/image?url=%2Fhero.jpg&w=640&q=80 640w,
/_next/image?url=%2Fhero.jpg&w=1080&q=80 1080w,
/_next/image?url=%2Fhero.jpg&w=1920&q=80 1920w,
/_next/image?url=%2Fhero.jpg&w=3840&q=80 3840w
"
sizes="100vw"
alt="Hero above-the-fold"
fetchpriority="high"
decoding="async"
style="color:transparent"
/>
Pro Tip: Best practice di Next.js Image:
- Usate la prop
priorityper la vostra immagine LCP (Largest Contentful Paint) — disattiva il lazy loading e aggiungefetchpriority="high" - Impostate
quality={80}per fotografia equality={90}per screenshot UI dove la chiarezza del testo conta - Usate
placeholder="blur"conblurDataURLper un'esperienza di caricamento curata - Per import statici, Next.js rileva automaticamente larghezza, altezza e genera placeholder sfocati
Considerazioni sulle prestazioni e Core Web Vitals
Le immagini sono tipicamente gli asset più pesanti di qualsiasi pagina web, spesso rappresentando il 50–70% del peso totale. Gestire correttamente le immagini Retina ha un impatto diretto e misurabile sui vostri Core Web Vitals.
Impatto sulle metriche chiave
| Metrica | Come le immagini la influenzano | Strategia di ottimizzazione |
|---|---|---|
| LCP (Largest Contentful Paint) | Le immagini hero sono spesso l'elemento LCP | Precaricare hero, usare caricamento prioritario, servire da CDN |
| CLS (Cumulative Layout Shift) | Immagini senza dimensioni causano spostamenti di layout | Sempre impostare width/height o usare aspect-ratio nel CSS |
| INP (Interaction to Next Paint) | Immagini grandi bloccano il main thread durante la decodifica | Usare decoding="async" e lazy loading |
| TTFB (Time to First Byte) | Immagini non ottimizzate sovraccaricano la banda del server | Cache CDN, formati moderni (AVIF/WebP) |
Audit Lighthouse: "Immagini correttamente dimensionate"
Lighthouse segnala immagini il cui file servito è significativamente più grande della dimensione di visualizzazione. Come superare questo audit costantemente:
- Non servite mai una singola immagine sovradimensionata. Usate
srcsetper fornire dimensioni appropriate. - Puntate al massimo 2x per la maggior parte dei casi. Servire immagini 3x offre ritorni visivi decrescenti aumentando significativamente la dimensione del file. La maggior parte degli utenti non percepisce la differenza tra 2x e 3x su schermi sotto i 27 pollici.
- Comprimete aggressivamente. WebP a qualità 80 è visivamente indistinguibile da JPEG a qualità 95 per la maggior parte del contenuto fotografico, a circa la metà della dimensione.
"Abbiamo scoperto che passando da PNG non ottimizzati a WebP correttamente dimensionato con srcset abbiamo ridotto il carico immagini del 73% e migliorato il nostro punteggio Lighthouse Performance da 62 a 94.
Strategia di lazy loading
Non tutte le immagini devono caricarsi immediatamente. Usate il lazy loading nativo per contenuto below-the-fold:
<!-- Above the fold: caricamento immediato con alta priorità -->
<img
src="/hero-800w.png"
srcset="/hero-800w.png 800w, /hero-1600w.png 1600w"
sizes="100vw"
alt="Banner hero"
fetchpriority="high"
decoding="async"
/>
<!-- Below the fold: lazy load -->
<img
src="/feature-800w.png"
srcset="/feature-800w.png 800w, /feature-1600w.png 1600w"
sizes="(max-width: 768px) 100vw, 50vw"
alt="Screenshot funzionalità"
loading="lazy"
decoding="async"
width="800"
height="450"
/>
Warning: Non fate mai lazy-load della vostra immagine LCP. L'attributo loading="lazy" sulla vostra immagine più grande above-the-fold è uno degli anti-pattern di prestazioni più comuni. Lighthouse lo segnalerà specificamente. Usate fetchpriority="high" per la vostra immagine hero.
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG FreeChecklist delle best practice per immagini responsive
Dopo aver lavorato su centinaia di audit di ottimizzazione immagini, ecco la checklist essenziale che seguo su ogni progetto:
Per ogni immagine del vostro sito
- Impostate attributi
widtheheightespliciti per prevenire CLS - Usate
loading="lazy"per immagini below-the-fold efetchpriority="high"per l'immagine LCP - Aggiungete testo
altsignificativo per accessibilità e SEO - Usate
decoding="async"per non bloccare il main thread
Per contenuto fotografico
- Generate almeno 4–5 varianti
srcset(es. 400w, 800w, 1200w, 1600w, 2400w) - Servite AVIF con fallback WebP tramite
<picture>o auto-formato CDN - Comprimete a qualità 75–85 per WebP (visivamente lossless per la maggior parte dei contenuti)
- Limitate la risoluzione massima a 2x della dimensione di visualizzazione più grande attesa (es. 2400w per un container da 1200px)
Per icone ed elementi di interfaccia
- Usate SVG ovunque possibile — è indipendente dalla risoluzione e minuscolo
- Incorporate le icone SVG critiche inline per eliminare richieste HTTP
- Usate uno sprite o sistema di simboli per icone ripetute
- Applicate
fill="currentColor"per adattamento automatico al tema
Per immagini di sfondo nel CSS
- Usate
image-set()per sfondi adattati al DPR (l'equivalente CSS disrcset):
.hero-bg {
/* Fallback per browser datati */
background-image: url("/images/hero-1x.png");
/* Sintassi moderna adattata al DPR */
background-image: image-set(
url("/images/hero-1x.png") 1x,
url("/images/hero-2x.png") 2x
);
background-size: cover;
background-position: center;
}
Conclusione
Le immagini Retina-ready non sono un lusso — sono un'aspettativa di base nel web moderno. La buona notizia è che gli strumenti e gli standard sono maturi: srcset e sizes danno ai browser tutto ciò che serve per prendere decisioni intelligenti, SVG elimina completamente il problema DPR per contenuto vettoriale, e framework come Next.js automatizzano il lavoro pesante.
La chiave è costruire un pipeline sistematico: partite da sorgenti di alta qualità, generate risoluzioni multiple, comprimete in formati moderni, e lasciate che il browser (o il CDN) serva l'asset giusto al dispositivo giusto. Fatelo bene, e consegnerete pagine ultra-nitide su ogni schermo mantenendo il vostro punteggio Lighthouse saldamente nel verde.
VectoSolve può aiutarvi. I nostri strumenti di ottimizzazione SVG e elaborazione immagini sono progettati per integrarsi perfettamente nel pipeline descritto sopra. Che stiate convertendo asset raster in SVG puliti o ottimizzando grafiche vettoriali esistenti, abbiamo creato gli strumenti per rendere le immagini Retina-ready senza sforzo.
| Tipo di display | Densità pixel | Moltiplicatore immagine necessario | Esempio |
|---|---|---|---|
| Standard (1x) | ~96 PPI | 1x | 300px CSS = immagine 300px |
| Retina / HiDPI (2x) | ~192 PPI | 2x | 300px CSS = immagine 600px |
| Super Retina (3x) | ~288+ PPI | 3x | 300px CSS = immagine 900px |
| Monitor 4K UHD | ~163 PPI (a 27") | 1.5x–2x | Varia in base all'impostazione di scala |
| iMac 5K | ~218 PPI | 2x | 300px CSS = immagine 600px |
Fonti e letture consigliate
- MDN: Responsive Images — Riferimento sviluppatori completo per l'uso di srcset, sizes e l'elemento picture
- web.dev: Serve Responsive Images — Guida Google focalizzata sulle prestazioni per servire immagini ottimali per dispositivo
- CSS-Tricks: Using SVG — Perché SVG è il formato ideale per grafiche web indipendenti dalla risoluzione
- Smashing Magazine: Retina Images — Guida tecnica approfondita per gestire display ad alta risoluzione nello sviluppo web moderno