我正在使用 ASP.NET MVC,并且我有一个上传文件的操作。文件正在正确上传。但我想要图像的宽度和高度。我想我需要先将其转换HttpPostedFileBase
为Image
然后继续。我怎么做?
如果有另一种更好的方法来获取图像的宽度和高度,请告诉我。
我正在使用 ASP.NET MVC,并且我有一个上传文件的操作。文件正在正确上传。但我想要图像的宽度和高度。我想我需要先将其转换HttpPostedFileBase
为Image
然后继续。我怎么做?
如果有另一种更好的方法来获取图像的宽度和高度,请告诉我。
我习惯Image.FromStream
如下:
Image.FromStream(httpPostedFileBase.InputStream, true, true)
请注意,返回Image
的是IDisposable
.
你需要一个引用才能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”编码器没有公开任何质量控制,并且选择了非常低的默认质量。
但是,您也可以手动选择编码器,然后您可以传递任意参数:
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);
}
}
为了保护文件是图像,通过将具有 MIME 类型的接受属性添加到输入标记来向视图添加 javascript 验证
<input type="file" accept="image/*">
和 jQuery 验证脚本
$.validator.addMethod('accept', function () { return true; });
整个解决方案可以在这里找到