我正在使用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块是构造函数内典型的 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);
}
}
<input type="file" accept="image/*">
以及jQuery验证脚本
$.validator.addMethod('accept', function () { return true; });
整个解决方案可以在这里找到。
httpPostedFileBase.InputStream
只在文件上传的请求中有效 - 在该请求中,您需要将数据保存到某个地方,并且您可能还想立即进行图像处理。 - Eamon Nerbonne