46 votes

Comment convertir un HttpPostedFileBase en 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 convertir le fichier HttpPostedFileBase a Image d'abord et ensuite de procéder. Comment dois-je m'y prendre ?

Et faites-moi savoir s'il existe une autre meilleure façon d'obtenir la largeur et la hauteur de l'image.

98voto

Eamon Nerbonne Points 21663

J'utilise Image.FromStream comme suit :

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

Notez que les données retournées Image es 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.

Redimensionnement de l'image

Je ne suis pas sûr de ce que vous essayez de faire, mais si vous faites des vignettes 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 originale que vous souhaitez mettre à l'échelle dans le nouveau bitmap (vous devrez gérer manuellement le rapport d'aspect). Le bloc de capture est typique IDisposable à l'intérieur d'un constructeur ; vous conservez la propriété du nouvel objet IDisposable jusqu'à ce qu'il soit retourné (vous pouvez vouloir documenter cela avec des commentaires de code).

Enregistrement en tant que 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 basse.

Cependant, vous pouvez également sélectionner manuellement l'encodeur, et vous pouvez alors 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);
}

6voto

Andree643 Points 15

Si vous êtes sûr que la source est une image et qu'elle n'a pas besoin d'être modifiée, vous pouvez le faire facilement comme décrit ci-dessous. aquí

[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 garantir que le fichier est une image, ajoutez la validation javascript à la vue en ajoutant l'attribut accept avec le type MIME à la balise d'entrée.

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

et la validation jQuery script

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

La solution complète peut être trouvée aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X