1

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

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

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

4

2 回答 2

3

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

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

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

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

于 2020-08-31T22:23:21.783 回答
2

这花了一些时间,但我已经弄清楚了:

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);

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

于 2020-08-28T19:09:16.600 回答