ASP.NET Core 图片上传和调整大小

11

如何获取已上传图像(IFormFile)的文件流并将其调整大小?

public ActionResult Upload(IFormFile file)
{
    using (var reader = new StreamReader(file.OpenReadStream()))
    {
        var fileContent = reader.ReadToEnd();
        var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);

        //scale image here?
    }
}
3个回答

13
你可以使用 IFormFile.OpenReadStream() 获取流,然后将流插入到一个 Image 中。在这个示例中,我将其缩放为 1024x768。
Image image = Image.FromStream(file.OpenReadStream(), true, true);
var newImage = new Bitmap(1024, 768);
using (var g = Graphics.FromImage(newImage))
{
    g.DrawImage(image , 0, 0, 1024, 768); 
}

您可以使用newImage来保存或对其进行任何操作。


2
如果它的目标是完整框架而不仅仅是核心,那么这将起作用。我可能错了,但我认为在核心中还没有一种处理图像的方法。http://www.hanselman.com/blog/RFCServersideImageAndGraphicsProcessingWithNETCoreAndASPNET5.aspx(对于像这样的原因,有足够的缺失,我针对4.6库)。 - b.pell
asp.net-core和asp.net 5目前在stackoverflow上是临时的同义词;但是,为了明确起见,我将更新标签以包括asp.net。顺便说一下,我是在谈论完整框架(4.6和core)。谢谢! - Nick De Beer
3
你应该看看这个项目(https://github.com/JimBobSquarePants/ImageProcessor),它正在更新以支持ASP.NET Core。它有相当不错的影响力,我认为它目前是解决这个问题的唯一方案。我们在多个.NET站点上使用它。 - Markus
这并不是什么新鲜事:https://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap(v=vs.110).aspx - JoshYates1980

6
从NuGet安装: Install-Package SixLabors.ImageSharp
[HttpPost]
public IActionResult Upload(IFormFile file)
{
    //Better use extension method
    string fileName;
    string customRoot = "wwwroot\\Upload\\";
    Directory.CreateDirectory(customRoot);
    var path = Path.Combine(Directory.GetCurrentDirectory(), customRoot,fileName);
    using var image = Image.Load(file.OpenReadStream());
    //100: height
    //100: width
    image.Mutate(x => x.Resize(100, 100));
    image.Save(path); 
    return Ok();
}

想了解更多信息: https://blog.elmah.io/upload-and-resize-an-image-with-asp-net-core-and-imagesharp/


0
非常有帮助。非常感谢。这个方面让我免于内存异常。如果您正在使用IFormFile接口,那么“file”在代码中指的是您的IFormFile。
这是我的实体的IFormFile属性。
[NotMapped]
public IFormFile MyImage1 { set; get; }

这是我如何使用它的方式

Image image = Image.FromStream(model.MyImage1.OpenReadStream(), true, true);

1
欢迎来到SO! - Chris Catignani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接