web-dev-qa-db-fra.com

Comment convertir un HttpPostedFileBase en une image?

J'utilise ASP.NET MVC et j'ai une action qui télécharge le fichier. Le fichier est téléchargé correctement. Mais je veux la largeur et la hauteur de l'image. Je pense que je dois d'abord convertir le HttpPostedFileBase en Image puis continuer. Comment je fais ça?

Et s'il vous plaît, faites-moi savoir s'il existe un autre meilleur moyen d'obtenir la largeur et la hauteur de l'image.

44

J'utilise Image.FromStream comme suit:

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

Notez que le Image retourné est IDisposable.

Vous aurez besoin d'une référence à System.Drawing.dll pour que cela fonctionne, et Image est dans le System.Drawing espace de noms.

Redimensionner l'image

Je ne sais pas ce que vous essayez de faire, mais si vous faites des miniatures ou quelque chose de similaire, vous pourriez être intéressé à faire quelque chose comme ...

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;
}

clipRectangle est le rectangle de l'image d'origine que vous souhaitez mettre à l'échelle dans le nouveau bitmap (vous devrez traiter manuellement le rapport hauteur/largeur). Le catch-block est une utilisation typique de IDisposable à l'intérieur d'un constructeur; vous conservez la propriété du nouvel objet IDisposable jusqu'à ce qu'il soit renvoyé (vous pouvez le documenter avec des commentaires de code).

Enregistrement au format Jpeg

Malheureusement, l'encodeur par défaut "enregistrer en jpeg" n'expose aucun contrôle de qualité et choisit une qualité par défaut terriblement faible.

Vous pouvez également sélectionner manuellement l'encodeur, puis passer des paramètres arbitraires:

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);
}
95
Eamon Nerbonne

Si vous êtes sûr que la source est une image et n'a pas besoin d'être modifiée, vous pouvez le faire facilement comme décrit ici

[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);
    }
}

Pour sécuriser le fichier est l'image, ajoutez la validation javascript à View en ajoutant un attribut accept avec le type MIME à la balise d'entrée

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

et script de validation jQuery

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

La solution complète peut être trouvée ici

5
Andree643