如何在保留 mimetype 的同时使用 ImageSharp 从磁盘加载图像并保存到流

How load an image from disk and save to a stream using ImageSharp while preserving the mimetype

我有一堆图像存储在磁盘上,图像的 mimetype 存储在数据库中。如果我想将图像保存到磁盘,我可以使用 Image.Save(string)(或异步版本)而无需知道图像的 MimeType。

但是,如果我想保存到流(例如,Response.Body),那么我必须使用 Image.Save(Stream, IImageEncoder)

如何获取我需要保存到流中的 IImageEncoder(不只是声明“我的所有图像 png/jpeg/bmp”并使用例如 JpegEncoder)?

花了一些时间,但我想通了:

var file = ... // From DB

ImageFormatManager ifm = Configuration.Default.ImageFormatsManager;
IImageFormat format = ifm.FindFormatByMimeType(file.MimeType);
IImageDecoder decoder = ifm.FindDecoder(format);
IImageEncoder encoder = ifm.FindEncoder(format);

using Image img = await Image.LoadAsync(file.OnDiskFilename, decoder); 
// Do what you want with the Image, e.g.: img.Mutate(i => i.Resize(width.Value, height.Value)); 
Response.ContentType = format.DefaultMimeType; // In case the stored mimetype was something weird 

await img.SaveAsync(Response.Body, encoder);

(虽然我很高兴看到更好的方式)

ImageSharp 已经可以告诉您输入图像的 mimetype。使用您的代码,如果 mimetype 与输入流不匹配则解码将失败。

(Image Image, IImageFormat Format) imf = await Image.LoadWithFormatAsync(file.OnDiskFilename);

using Image img = imf.Image;
img.Save(Response.Body, imf.Format);

我们是什么 missing 然而,在当前的 API v1.0.1 中,我们能够在传递格式时异步保存。我们需要添加它。