Domanda Come si converte un HttpPostedFileBase in un'immagine?


Sto usando ASP.NET MVC e ho un'azione che carica il file. Il file viene caricato correttamente. Ma voglio larghezza e altezza dell'immagine. Penso di aver bisogno di convertire il HttpPostedFileBase a Image prima e poi procedere. Come lo faccio?

E per favore fammi sapere se c'è un altro modo migliore per ottenere la larghezza e l'altezza dell'immagine.


44
2017-07-23 13:24


origine


risposte:


Io uso Image.FromStream a come segue:

Image.FromStream(httpPostedFileBase.InputStream, true, true)

Si noti che il reso Image è IDisposable.

Avrai bisogno di un riferimento a System.Drawing.dll perché questo funzioni, e Image è nel System.Drawing namespace.

Ridimensionamento dell'immagine

Non sono sicuro di cosa stai cercando di fare, ma se ti capita di fare miniature o qualcosa di simile, potresti essere interessato a fare qualcosa come ...

try {
    var bitmap = new Bitmap(newWidth,newHeight);
    using (Graphics g = Graphics.FromImage(bitmap)) {
        g.SmoothingMode = SmoothingMode.HighQuality;
        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
        g.CompositingQuality = CompositingQuality.HighQuality;
        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
        g.DrawImage(oldImage,
            new Rectangle(0,0,newWidth,newHeight),
            clipRectangle, GraphicsUnit.Pixel);
    }//done with drawing on "g"
    return bitmap;//transfer IDisposable ownership
} catch { //error before IDisposable ownership transfer
    if (bitmap != null) bitmap.Dispose();
    throw;
}

dove clipRectangle è il rettangolo dell'immagine originale che desideri ridimensionare nella nuova bitmap (dovrai gestire manualmente le proporzioni). Il catch-block è tipico IDisposable utilizzo all'interno di un costruttore; si mantiene la proprietà del nuovo IDisposable oggetto fino a quando non viene restituito (si consiglia di documentarlo con codice-commenti).

Salvataggio come Jpeg

Sfortunatamente, il codificatore "salva come jpeg" predefinito non espone alcun controllo di qualità e sceglie una qualità predefinita terribilmente bassa.

È possibile selezionare manualmente l'encoder, tuttavia, e quindi è possibile passare parametri arbitrari:

ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders()
    .Where(codecInfo => codecInfo.MimeType == "image/jpeg").First();
using (EncoderParameters encParams = new EncoderParameters(1))
{
    encParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)quality);
    //quality should be in the range [0..100]
    image.Save(outputStream, jpgInfo, encParams);
}

91
2017-07-23 13:28



Se sei sicuro che la fonte è l'immagine e non ha bisogno di modifiche, puoi farlo facilmente come descritto Qui

[HttpPost]
public void Index(HttpPostedFileBase file)
{
    if (file.ContentLength > 0)
    {
        var filename = Path.GetFileName(file.FileName);

        System.Drawing.Image sourceimage =
            System.Drawing.Image.FromStream(file.InputStream);
    }
}

Per proteggere il file è un'immagine, aggiungi la convalida javascript a Visualizza aggiungendo l'attributo accept con il tipo MIME al tag di input

<input type="file" accept="image/*">

e script di convalida jQuery

$.validator.addMethod('accept', function () { return true; });

L'intera soluzione può essere trovata Qui


5
2017-11-20 11:58