Vb.net 使用FromStream从Memorystream创建imagine会出现内存不足错误

Vb.net 使用FromStream从Memorystream创建imagine会出现内存不足错误,vb.net,memorystream,Vb.net,Memorystream,我有一个使用System.Drawing.Image.FromStream从btye[]数组创建imagine的简单实现。见下文: Using ms As System.IO.MemoryStream = New System.IO.MemoryStream(Convert.FromBase64String(Value), 0, Convert.FromBase64String(Value).Length) Dim img As System.Drawing.Image

我有一个使用System.Drawing.Image.FromStream从btye[]数组创建imagine的简单实现。见下文:

Using ms As System.IO.MemoryStream = New System.IO.MemoryStream(Convert.FromBase64String(Value), 0, Convert.FromBase64String(Value).Length)

       Dim img As System.Drawing.Image
       img = System.Drawing.Image.FromStream(ms)
       eRow.Properties.Value = img
End Using
这在大多数情况下确实有效。有时我会遇到一个“内存不足”错误,试图加载完全相同的内存

消息:内存不足。堆栈:在DevExpress.XtraEditors.Drawing.PictureEditPainter.DrawImageCore中的System.Drawing.Graphics.DrawImage(图像图像、矩形析取、矩形srrect、图形sunit srcUnit)中的System.Drawing.Graphics.CheckErrorStatus(Int32状态)(ControlGraphicsInfoArgs信息、PictureEditViewInfo vi、矩形屏幕、矩形源、图像图像、布尔值prevImage)位于DevExpress.xtraEditor.Drawing.PictureEditPainter.DrawImage(ControlGraphicsInfoArgs信息)位于DevExpress.xtraEditor.Drawing.PictureEditPainter.DrawContent(ControlGraphicsInfoArgs信息)在DevExpress.XtraEditors.Drawing.BaseControlPainter.Draw(ControlGraphicsInfoArgs信息)在DevExpress.XtraEditors.Drawing.BaseEditPainter.Draw(ControlGraphicsInfoArgs信息)在DevExpress.XtraVerticalGrid.Painters.VGridPainter.DrawRowValueCellCore位于DevExpress.XtraVerticalGrid.Painters.VGridPainter.DrawRowValueCell(RowValueInfo rv、BaseViewInfo vi、MultiEditorRowViewInfo meri、Int32和sepIndex)的DevExpress.XtraVerticalGrid.Painters.VGridPainter.DrawRowValueCell(RowValueInfo rv、BaseViewInfo vi、MultiEditorRowViewInfo meri、Int32和sepIndex)位于DevExpress.XtraVerticalGrid.Painters.VGridPainter.DrawRows(BaseViewInfo vi)位于DevExpress.XtraVerticalGrid.Painters.VGridPainter.dDrawCore(BaseViewInfo vi)位于DevExpress.XtraVerticalGrid.VGridControlBase.OnPaint(PaintEventArgs e)处在System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,Int16层)在System.Windows.Forms.Control.WndProc(Message&m)在System.Windows.Forms.Control.WndProc(Message&m)在DevExpress.XtraEditors.Container.WndProc(Message&m)在DevExpress.XtraVerticalGrid.VGridControlBase.WndProc(Message&m)中在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)源:System.Drawing

我确实注意到,当调用此行“img=System.Drawing.Image.FromStream(ms)”时,ms.position没有到达终点/不等于ms.length的长度,这时我得到了这个错误

添加多一点上下文。最初的设想是一个大约30kb的.jpeg,保存到一个memorystream中,然后转换成一个字符串并编码到base64。我将该字符串保存到varchar(max)的sql数据库中。然后,我从sql中检索该字符串,并将该字符串作为字符串加载到datatable中。如果需要,我将从datatable中检索该字符串并调用上述函数

这是我用来转换图像的代码,然后将图像作为varchar(max)保存到sql数据库

同样地,在同一个想象中,它只会偶尔发生一次。有人知道为什么会断断续续地发生吗?
谢谢

dim imageBytes=Convert.FromBase64String(Value)使用ms作为新内存流(imageBytes,false)ms.Position=0 dim img=Image.FromStream(ms,True)结束使用
。图像大小和类型必须与GDI+位图对象大小要求和支持的类型兼容。嗨,Jimi,感谢您的输入,图像大小和类型是兼容的。让我澄清一下,一个特定的图像将在大多数时间加载,但奇数次不会加载。我添加了一个try/catch,如果我得到“o”,则不加载内存不足。即使在我收到错误后,下一次(可能5秒后)我尝试加载相同的文件,并想象它会起作用。是的,很明显:有时会出现异常。您需要指定(更新您的问题,而不是在注释中),这些图像是在什么上下文中生成的,它们的来源,图像的大小,以及说明在此上下文中执行的操作的post代码。由于某些原因,您有一个包含图像数据的Base64字符串,因此此字符串的性质和来源也很重要。如果以某种方式涉及线程,这也很重要nt。Image和Bitmap类是惰性的,当您使用它们时,它们可能需要访问其底层存储。这种情况非常不可预测,这取决于特定的图像格式和大小。在这段代码中无法工作,它处理了MemoryStream。异常很糟糕,它不知道存储突然消失的原因。您可以不能使用
使用
。不要担心处理该流,它只是内存。
Using ms As System.IO.MemoryStream = New System.IO.MemoryStream()                             CType(value, Image).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
       _newValue = Convert.ToBase64String(ms.ToArray)
End Using