如何在保留 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 中,我们能够在传递格式时异步保存。我们需要添加它。
我有一堆图像存储在磁盘上,图像的 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 中,我们能够在传递格式时异步保存。我们需要添加它。