你如何将HttpPostedFileBase转换为图像?

我正在使用ASP.NET MVC,我有一个上传文件的操作。 该文件正在上传。 但是我想要图像的宽度和高度。 我想我需要首先将HttpPostedFileBase转换为Image ,然后继续。 我怎么做?

请让我知道是否有另一种更好的方式来获得图像的宽度和高度。

我使用Image.FromStream如下:

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

请注意,返回的ImageIDisposable

你需要一个对System.Drawing.dll的引用才能工作, Image位于System.Drawing命名空间中。

调整图像大小

我不确定你想要做什么,但是如果你碰巧正在制作缩略图或类似的东西,你可能有兴趣做一些像…

 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是你想缩放到新位图的原始图像的矩形(你需要手动处理宽高比)。 catch-block是构造函数中典型的IDisposable用法, 您将保留新的IDisposable对象的所有权,直到它被返回(您可能需要使用代码注释来处理该事件)。

另存为JPEG

不幸的是,默认的“保存为JPEG”编码器不公开任何质量控制,并select一个非常低的默认质量。

您也可以手动select编码器,然后您可以传递任意参数:

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

如果您确定,源代码是图片,并且不需要编辑,您可以按照此处所述轻松完成

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

为了保护文件是图像,添加javascriptvalidation视图通过添加接受属性与MIMEtypesinput标签

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

和jQueryvalidation脚本

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

整个解决scheme可以在这里find