3a9174f6fc
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>
31 lines
954 B
C#
31 lines
954 B
C#
using SteUp.Maui.Core.Services;
|
|
using SteUp.Shared.Core.Dto;
|
|
|
|
namespace SteUp.Maui.Core.Utility;
|
|
|
|
public static class UtilityFile
|
|
{
|
|
public static async Task<AttachedDto> ConvertToDto(FileResult file, AttachedDto.TypeAttached type)
|
|
{
|
|
var stream = await file.OpenReadAsync();
|
|
using var ms = new MemoryStream();
|
|
await stream.CopyToAsync(ms);
|
|
|
|
var bytes = ms.ToArray();
|
|
|
|
// Unico punto di passaggio di fotocamera e galleria: raddrizziamo qui, cosi'
|
|
// miniature, salvataggio locale e upload lavorano tutti su pixel gia' dritti.
|
|
if (type == AttachedDto.TypeAttached.Image)
|
|
bytes = ImageOrientation.Normalize(bytes);
|
|
|
|
return new AttachedDto
|
|
{
|
|
Name = file.FileName,
|
|
Path = file.FullPath,
|
|
MimeType = file.ContentType,
|
|
DimensionBytes = bytes.Length,
|
|
FileBytes = bytes,
|
|
Type = type
|
|
};
|
|
}
|
|
} |