我已经读取了图像,并以byte []格式将它们保存在数据库中。后来我想检索图像并将它们转换为图像格式。我写了以下方法:
private List<Image> ConvertByteArraysToImages(List<byte[]> byteDataList)
{
List<Image> retVal = new List<Image>();
int counter = 0;
foreach (byte[] byteData in byteDataList)
{
// Something is wrong here
MemoryStream memstr = new MemoryStream(byteData);
Image img = Image.FromStream(memstr);
retVal.Add(img);
memstr.Dispose();// Just added this
// This works fine, the images appear in the folder
System.IO.File.WriteAllBytes(String.Format(@"C:\dev\test{0}.png", counter), byteData);
counter++;
}
return retVal;
}
我从一个动作调用此方法,该动作将图像添加到ViewBag以在视图中使用。
public ActionResult ViewTicket(Incident ticket)
{
//Read the ticket via the web API
string serialisedJSON = JsonConvert.SerializeObject(ticket.ID);
string response = TicketUtilities.JSONRequestToAPI(serialisedJSON, "GetSingleIncident");
Incident retVal = JsonConvert.DeserializeObject<Incident>(response);
//Convert byte[] to Image and add to ViewBag
List<Image> ScreenshotImagesFullsize = ConvertByteArraysToImages(retVal.Screenshots);
ViewBag.Add(ScreenshotImagesFullsize); //Error here
return View(retVal);
}
当我尝试将图像添加到ViewBag时,我在浏览器中收到以下错误:
Cannot perform runtime binding on a null reference
将字节数组写入文件会产生正确的输出,但我没有在返回值中获得图像列表。在调试模式下将鼠标悬停在retVal
上会显示以下内容:
我传入了两个字节数组,我在retVal
中看到了2个对象,但我也看到了错误:“无法计算表达式,因为当前方法的代码已经过优化”。为什么会这样?
更新:我禁用了JIT优化,现在我可以看到以下内容:
我可以看到对象已正确获取高度和宽度等属性,但实际数据为空。
答案 0 :(得分:0)
只要您需要图像,请不要丢弃流并至少保留一个引用。
“您必须在图像的生命周期内保持流打开。”
https://msdn.microsoft.com/de-de/library/1kcb3wy4(v=vs.110).aspx
请注意,无需在MemoryStream上手动调用dispose,因为它没有非托管资源
答案 1 :(得分:0)
所以我解决了这个问题,结果证明问题不是转换,而是将Image对象添加到视图中。由于某种原因,将Image对象添加到视图不起作用,为了克服这个问题,我将图像转换为Base64字符串
using (MemoryStream m = new MemoryStream())
{
retVal.Img.Save(m, retVal.Img.RawFormat);
byte[] imageBytes = m.ToArray();
// Convert byte[] to Base64 String
string imreBase64Data = Convert.ToBase64String(imageBytes);
retVal.ImgB64 = string.Format("data:image/png;base64,{0}", imreBase64Data);
}