Image 如何将HttpPostedFileBase转换为映像?
我正在使用ASP.NET MVC,我有一个上载文件的操作。文件正在正确上载。但我想要图像的宽度和高度。我想我需要先将Image 如何将HttpPostedFileBase转换为映像?,image,httppostedfilebase,asp.net-mvc-file-upload,Image,Httppostedfilebase,Asp.net Mvc File Upload,我正在使用ASP.NET MVC,我有一个上载文件的操作。文件正在正确上载。但我想要图像的宽度和高度。我想我需要先将HttpPostedFileBase转换为Image,然后继续。我该怎么做 请告诉我是否有其他更好的方法来获取图像的宽度和高度。我使用的方法如下: Image.FromStream(httpPostedFileBase.InputStream, true, true) 请注意,返回的图像是IDisposable 您需要一个对System.Drawing.dll的引用才能工作,并且
HttpPostedFileBase
转换为Image
,然后继续。我该怎么做
请告诉我是否有其他更好的方法来获取图像的宽度和高度。我使用的方法如下:
Image.FromStream(httpPostedFileBase.InputStream, true, true)
请注意,返回的图像
是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
不幸的是,默认的“另存为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);
}
如果您确定源是图像,并且不需要编辑,那么可以按照描述轻松地进行编辑 为了保护文件是图像,通过将带有MIME类型的accept属性添加到输入标记,将javascript验证添加到视图中
<input type="file" accept="image/*">
整个解决方案可以在伟大的代码片段中找到!为什么要处理catch块中的图像,然后重新引发异常,而不仅仅是使用finally块?因为finally块总是执行,但是新创建的图像只需要在出错时处理。如果没有发生错误,则新映像已正确构造并归调用函数所有-现在由调用函数负责处理。我将添加关于IDisposable的try-catch的解释。嗨,很抱歉激活了此死线程,我想知道,您知道如何将文件保存到文件系统中吗?我不想用数据库来保存它,也许只是url。此外,我还想知道,当图像大小为150x150时,我是否想将大小调整为50x100。建议始终将w和h设置为这些数字,还是按比例调整以满足限制?谢谢此代码只是缩放图像-您需要决定如何裁剪(
clipRectangle
),并确保生成的纵横比不会太远。要保存到文件系统,只需将适当的流(在本例中,它名为outputStream
)传递到save
方法。
<input type="file" accept="image/*">
$.validator.addMethod('accept', function () { return true; });