尝试在 ASP Net Core 中将 jpeg 转换为 png 会引发 GDI+ 异常

问题描述

我在 ASP Net Core (5) 应用程序中使用 System.Drawing.Common 5.0.1 nuget 包,并且想要将图像(可以是 jpeg、png 等)转换为 png(如果还不是 png)。

当图像成功上传后,我尝试使用以下代码对其进行转换(图像字节在 uploadResult.FileData 中可用):

byte[] imageBytes;
            if (fileExtension.ToLower() != "png")
            {
                using (var ms = new MemoryStream(uploadResult.FileData))
                {
                    using(Image image = Image.FromStream(ms))
                    {
                        image.Save(ms,ImageFormat.Png);
                        imageBytes = ms.ToArray();
                    }
                }
            }

它总是在这一行失败: image.Save(ms,ImageFormat.Png);

异常: An exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.Common.dll but was not handled in user code: 'A generic error occurred in GDI+.'

我知道本网站上有很多关于此错误消息的帖子,其中包含很好的答案,但我相信我遵循了它们。此外,大多数问题使用文件系统中的图像或写入其中,但我的图像已作为字节数组可用,并且我写入内存流 - 但我看不出是什么原因导致了这种情况。

解决方法

好的,它工作起来了,感谢 John 使用以下方法的评论:

                using (var ms = new MemoryStream(uploadResult.FileData))
                {
                    using (var targetMs = new MemoryStream())
                    {
                        using(Image image = Image.FromStream(ms))
                        {
                            image.Save(targetMs,ImageFormat.Png);
                            imageBytes = targetMs.ToArray();
                        }
                    }
                }

不确定这是否是最好的方法,或者至少是一种好方法。如果有人想出更好的东西(尤其是在性能/内存使用方面),我希望看到它。