【问题标题】:Error converting byte array to Image将字节数组转换为图像时出错
【发布时间】:2018-01-10 12:18:15
【问题描述】:

我已读取图像并将它们以 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 中看到了两个对象,但我也看到了错误:“无法评估表达式,因为当前方法的代码已优化”。为什么会出现这种情况?

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

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

【问题讨论】:

  • Dispose() memstr 和你在哪里打电话给ConvertByteArraysToImages
  • 你的项目的Optimize code是否被检查?
  • 检查一下,如果您的解决方案处于发布模式并且项目处于调试状态。另外,您可以尝试从项目中删除优化代码参数。
  • 我禁用了优化,上面贴了截图,谢谢
  • 那么,您的问题到底是什么?除了不处理那些流(相信我,它们会增加)?您是否尝试过在函数之外使用这些图像?

标签: c# asp.net arrays image


【解决方案1】:

只要您需要图像,就不要释放流并至少保留一个对它的引用。

“您必须在图像的生命周期内保持流打开。”

https://msdn.microsoft.com/de-de/library/1kcb3wy4(v=vs.110).aspx

请注意,无需在 MemoryStream 上手动调用 dispose,因为它没有非托管资源

【讨论】:

  • 谢谢,我删除了 dispose 但尝试将图像添加到 ViewBag 时仍然遇到同样的问题
  • 你确定图片真的有问题吗?图像的数据字段在使用流时实际上保持为空。尝试在图像对象“img”上调用 Save 方法,以确定图像是否已创建
【解决方案2】:

所以我解决了这个问题,结果证明问题不是转换,而是将 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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2013-05-19
    • 2013-01-14
    • 2013-07-29
    相关资源
    最近更新 更多