Raddrizza le foto applicando l'orientamento EXIF

La fotocamera di sistema non ruota lo scatto: salva i pixel come li legge
il sensore e annota la rotazione in EXIF. SkiaSharp (SKBitmap.Decode)
ignora quel tag, quindi le foto scattate ruotate finivano storte nelle
miniature e venivano inviate cosi' al server.

- ImageOrientation: applica l'orientamento ai pixel e ricodifica senza tag
  residui, mantenendo il formato di partenza. Immagine gia' dritta: nessuna
  ricodifica, per non perdere qualita' inutilmente. In caso di errore
  restituisce i byte originali, meglio una foto storta che nessuna foto.
- UtilityFile.ConvertToDto: normalizza li', unico punto di passaggio di
  fotocamera e galleria, cosi' miniature, salvataggio locale e upload
  lavorano su pixel gia' dritti. Corretto anche DimensionBytes.
- ImageThumb: applica l'orientamento anche in fase di miniatura, per
  raddrizzare le foto gia' presenti sul dispositivo.

Nessun ritratto forzato: costringere una foto orizzontale in verticale
vorrebbe dire ruotare il contenuto o ritagliarlo, e queste foto sono prove
di ispezione.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 10:32:41 +02:00
parent 3b04702665
commit 3a9174f6fc
3 changed files with 123 additions and 5 deletions
+7 -3
View File
@@ -19,11 +19,15 @@ public static class ImageThumb
throw new InvalidOperationException("Formato immagine non supportato o file corrotto.");
// Decodifica
var info = codec.Info;
using var bitmap = SKBitmap.Decode(codec);
if (bitmap is null)
using var decoded = SKBitmap.Decode(codec);
if (decoded is null)
throw new InvalidOperationException("Impossibile decodificare l'immagine.");
// SKBitmap.Decode non applica l'orientamento EXIF: senza questo passaggio le
// miniature delle foto scattate ruotate escono storte (vale anche per gli
// scatti già sul dispositivo, che non passano da UtilityFile.ConvertToDto).
using var bitmap = ImageOrientation.Upright(decoded, codec.EncodedOrigin);
// Calcola resize mantenendo aspect ratio
var w = bitmap.Width;
var h = bitmap.Height;