12 messaggi dal 05 settembre 2010
In una pagina Asp.Net mvc 5 ho la possiblità di caricare foto sul server, fin qui tutto bene.
Però se la foto è stata scattata da un tablet (es. Surface, Ipad)e carico lo stream con la classe System.Drawing.Bitmap i valori dell'altezza e larghezza della foto vengono invertiti!!!
Stessa cosa con BitmapImage di wpf!!!
Quindi se vorrei fare una miniatura la foto viene salvata capovolta!!!
Se invece sono foto scattate da smartphone o altro tutto OK.
Perché??? Qualcuno è a conoscenza di questo presunto bug???
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao,
non sono del tutto convinto che la classe Bitmap si metta ad invertire le misure; forse quello era l'orientamento originale della foto. Magari ti è stata inviata dal tablet già ruotata di lato di 90°.

Prova a salvare l'originale per verificare se è effettivamente così.
fileUpload1.PostedFile.SaveAs(percorso);


ciao,
Moreno

Enjoy learning and just keep making
12 messaggi dal 05 settembre 2010
Con HttpPostFileBase.SaveAs(...) va tutto ok! Quando faccio il debug, la classe Bitmap o BitmapImage hanno le misure invertite. Ovviamente con del codice che produce miniature mi trovo le foto invertite!Ripeto solo con foto scattate da tablet...
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao,

volsoft ha scritto:

Con HttpPostFileBase.SaveAs(...) va tutto ok!

ok, puoi condividere una delle foto scattate da tablet che hai salvato col metodo SaveAs? Vorrei provare a riprodurre il problema in locale. Se sei d'accordo, pubblicala sul tuo SkyDrive o altro servizio di condivisione. Attenzione che non venga alterata durante l'upload (es. ridimensionata).
Grazie.
Modificato da BrightSoul il 24 novembre 2013 17.34 -

Enjoy learning and just keep making
12 messaggi dal 05 settembre 2010
Ciao, scusa il ritardo.

Ho caricato le foto sul mio SkyDrive. Sono quattro:
una scattata da Surface Rt, una da Ipad, e le due relative miniature
che sono capovolte!!!

Link di condivisione: http://sdrv.ms/1aSfsDB

Grazie per l'interessamento.
11.884 messaggi dal 09 febbraio 2002
Contributi
Ciao,
ha ragione la classe Bitmap: quelle foto sono capovolte.

Tuttavia, se su Windows, su Skydrive e in qualsiasi altro visualizzatore d'immagini le vedi dritte è perché, a corredo della foto, il tablet ha posto una proprietà Exif che indica qual era l'orientamento al momento dello scatto. Grazie ad essa, i visualizzatori sanno come devono ruotare la foto affinché l'utente la veda dritta.

Il tuo problema è che, quando ti crei la miniatura, le proprietà Exif vanno perse ed i visualizzatori non sanno più di dover ruotare la foto. Puoi risolvere in due modi:
  • Preservare almeno la proprietà Exif dell'orientamento. Questo puoi farlo così, copiando banalmente la proprietà dall'immagine originale alla thumbnail.
    try {
    var orientamento = imgOriginale.GetPropertyItem(0x0112);
    imgThumbnail.SetPropertyItem(orientamento);
    } catch {}
    
    Solo per curiosita: il "valore magico" 0x0112 lo trovi descritto nella documentazione delle GDI+, insieme a tutti i valori che quella proprietà può assumere (da 1 a 8).
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms534416(v=vs.85).aspx#_gdiplus_constant_propertytagorientation
  • In alternativa, se non vuoi che la corretta visualizzazione dipenda da una proprietà Exif, puoi leggerti il valore e ruotare la foto di conseguenza, proprio come farebbe un visualizzatore. Questo schema ti aiuta a capire come fare le rotazioni.
    Esempio:
    var tipiDiOrientamento = new RotateFlipType[]{
            RotateFlipType.RotateNoneFlipNone,  //0
            RotateFlipType.RotateNoneFlipNone,  //1
            RotateFlipType.RotateNoneFlipX,     //2
            RotateFlipType.Rotate180FlipNone,   //3
            RotateFlipType.Rotate180FlipX,      //4
            RotateFlipType.Rotate90FlipX,       //5
            RotateFlipType.Rotate90FlipNone,    //6
            RotateFlipType.Rotate270FlipX,      //7
            RotateFlipType.Rotate270FlipNone    //8
    };
    
    var orientamento = imgOriginale.GetPropertyItem(0x0112).Value[0];
    imgThumbnail.RotateFlip(tipiDiOrientamento[orientamento]);
    


Comunque, se per il ridimensionamento ti affidi a qualche libreria esterna, controlla se ha già qualche opzione per gestire questa casistica.

ciao,
Moreno
Modificato da BrightSoul il 25 novembre 2013 17.22 -

Enjoy learning and just keep making
12 messaggi dal 05 settembre 2010
Ti ringrazio,
ho risolto con Bitmap.Rotateflip(...) va tutto ok!!! Ovviamente si deve controllare se la foto supporta le proprietà exif.
Invece il metodo Bitmap.SetPropertyItem(...) non mi risolve il problema!
11.884 messaggi dal 09 febbraio 2002
Contributi
ciao,

volsoft ha scritto:
Invece il metodo Bitmap.SetPropertyItem(...) non mi risolve il problema!

Mmmh, potrebbe essere che non stai salvando nel formato jpeg.
Quando invochi il metodo Save per salvare la miniatura, rendi esplicito il formato dell'immagine.
miniatura.Save(percorso, ImageFormat.Jpeg);


ciao,
Moreno.

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.