C# Image.Save() 导致保存 JPG 文件时无法访问已关闭的流(PNG 有效)
C# Image.Save() cause Cannot access a closed Stream when saving JPG file (PNG works)
我的行为很奇怪。
我有一个代码,当我将 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: 'Cannot access a closed Stream.'
- 我尝试过使用 Bitmap - 将 imgTarget 复制到新的 Bitmap 然后保存(结果相同)
- 我尝试调用 Save() 方法并将 ImageFormat 参数正确设置为 jpeg 或 png(结果相同)- 对于 Image.Save() 和 Bitmap.Save()
- 我检查了正确的路径和文件名(没问题)(在本例中是C:\MyProd\wwwroot\ImageBank611_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 上的使用,或删除 ConvertBytesToImage 并保持 MemoryStream 活动,直到您完全保存图像。 – Simon Mourier 1 分钟前
我不明白为什么,但我已经删除了 using 语句,现在可以使用了。
谢谢大家
我的行为很奇怪。
我有一个代码,当我将 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: 'Cannot access a closed Stream.'
- 我尝试过使用 Bitmap - 将 imgTarget 复制到新的 Bitmap 然后保存(结果相同)
- 我尝试调用 Save() 方法并将 ImageFormat 参数正确设置为 jpeg 或 png(结果相同)- 对于 Image.Save() 和 Bitmap.Save()
- 我检查了正确的路径和文件名(没问题)(在本例中是C:\MyProd\wwwroot\ImageBank611_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 上的使用,或删除 ConvertBytesToImage 并保持 MemoryStream 活动,直到您完全保存图像。 – Simon Mourier 1 分钟前
我不明白为什么,但我已经删除了 using 语句,现在可以使用了。
谢谢大家