Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何将HttpPostedFileBase转换为映像?_Image_Httppostedfilebase_Asp.net Mvc File Upload - Fatal编程技术网

Image 如何将HttpPostedFileBase转换为映像?

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的引用才能工作,并且

我正在使用ASP.NET MVC,我有一个上载文件的操作。文件正在正确上载。但我想要图像的宽度和高度。我想我需要先将
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; });