【问题标题】:How load an image from disk and save to a stream using ImageSharp while preserving the mimetype如何在保留 mimetype 的同时使用 ImageSharp 从磁盘加载图像并保存到流
【发布时间】:2020-12-17 17:36:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# asp.net-core imagesharp


    【解决方案1】:

    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 中,我们能够在传递格式时异步保存。我们需要添加它。

    【讨论】:

    • 我已经知道磁盘上图像的媒体类型(它在带有文件名的数据库中)所以我不需要发现它,我只需要获得一个解码器/编码器对所以我可以加载/保存图像。
    • 如果它出错了?...使用我建议的方法,您甚至不需要存储它(除非您在其他地方需要它)。无论如何,您为发现要使用的编码器而调用的所有方法都由重载调用。相信我,我拥有图书馆。
    • 你说服了我 :)
    • 你没有在Image这里使用dispose。
    • 是的,我通过using 声明。 using Image img = imf.Image;
    【解决方案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);
    
    

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

    【讨论】:

    • 这看起来像是用于生成缩略图或等效的。你可能想重新考虑在你改变它之后返回原始文件格式......你可能永远不会想要调整 bmp 的大小然后以 bmp 格式返回它,在这种情况下你总是想要一个不错的压缩 jpeg 或 png。
    • 也许吧,尽管查看我当前的数据集,我有大约 1500 个 jpeg 和 6 个 png,没有别的(而且我不想将我的 png 保存为 jpeg,反之亦然)
    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多