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.
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.
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;
}
où 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).
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);
}
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