将字节数组转换为Image时出错

时间:2018-01-10 12:18:16

标签: c# asp.net arrays image

我已经读取了图像,并以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上会显示以下内容:

enter image description here

我传入了两个字节数组,我在retVal中看到了2个对象,但我也看到了错误:“无法计算表达式,因为当前方法的代码已经过优化”。为什么会这样?

更新:我禁用了JIT优化,现在我可以看到以下内容:

enter image description here

我可以看到对象已正确获取高度和宽度等属性,但实际数据为空。

2 个答案:

答案 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);
        }