微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# Image.Save() 原因 保存 JPG 文件时无法访问关闭的流PNG 有效

如何解决C# Image.Save() 原因 保存 JPG 文件时无法访问关闭的流PNG 有效

我有奇怪的行为。

我有一个代码,当我将 byte[] 数组发送到图像(有时是 png,有时是 jpg)时。

当我保存 PNG 格式时 - 一切正常,但是当我尝试保存 JPG 时,有一个例外:“无法访问关闭的流”

代码

imgTarget.Save(wwwroot + "\\ImageBank\\" + TaskRunID + "_" + TestCaseID + "_" + TestDataID + "_" + ImageCounter + Extension,ImageFormat.Jpeg);

我检查了什么:

  • imgTarget 不为空
  • imgTarget 包含正确的数据(即使 RawFormat 应该是 Png 或 Jpeg)
  • imgTarget.Save() 抛出异常:System.ObjectdisposedException:'无法访问关闭的流。'
  • 我尝试使用位图 - 将 imgTarget 复制到新位图,然后保存(结果相同)
  • 我尝试调用 Save() 方法,并将 ImageFormat 参数正确设置为 jpeg 或 png(结果相同)-对于 Image.Save() 和 Bitmap.Save()
  • 我检查了正确的路径和文件名(没问题)(在本例中为 C:\MyProd\wwwroot\ImageBank\10611_8_-1_1.jpeg)

奇怪的是 imgTarget 在调用方法 Save() 之前包含数据 - 但在它为 null/disposed 之后...

有人有什么想法吗?

编辑:

我准备了一些以同样方式失败的代码 - 它在最后一行失败。Save()

// This contains only the URL for the downloading of the file
string url = $"***url to download jpg file***";

// Request for the API - which downloads the jpg file via GET and provide the RawData via Response.RawBytes
APIRequest request = new APIRequest(RestSharp.Method.GET,url,new Authentication("user","password","-1"));

// Test case is only class which calls RestSharp (get png or jpg file)
TestCase t = new TestCase();
// This downloads the jpg file and store it as byte[] in t.GetDataFromAPI
t.API(request);
// Using downloaded data as byte[]
byte[] APIImageSource = t.GetDataFromAPI;
// Default extensions for saving files is .png
string Extension = ".png";
            

Image imgTarget;
// Now I use bytes[] and convert them into the image
imgTarget = ConvertBytesToImage(APIImageSource);
if (t.GetimageFormat(APIImageSource) == ExpectedFormat.JPEG)
{
     Extension = ".jpeg";
}
string path = "C:\\Temp\\filename" + Extension;
imgTarget.Save(path + Extension,ImageFormat.Jpeg);

方法 ConvertBytesToImage:

internal static Image ConvertBytesToImage(byte[] bytes)
{
    using (var ms = new MemoryStream(bytes))
    {
        return Image.FromStream(ms);
    }
}

解决方法

@Simon Mourier 的评论是解决方案:

删除 MemoryStream 上的 using,或删除 ConvertBytesToImage 并保持 MemoryStream 处于活动状态,直到您完全保存图像。 – 西蒙·穆里埃 1 分钟前

我不明白为什么,但我已经删除了 using 语句,现在它可以工作了。

谢谢大家

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。