以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 从二进制列提取图片保存,提示内存溢出 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=186637) |
-- 作者:kao_go -- 发布时间:2023/5/17 8:53:00 -- 从二进制列提取图片保存,提示内存溢出 以下代码引发类型为“System.OutOfMemoryException”的异常。 Dim cmd As New SQLCommand cmd.C cmd.CommandText = "s elect style_id,image_1 from s_style" Dim dt As DataTable = cmd.ExecuteReader Dim src As String If dt.DataRows.Count > 0 Then For Each dr As DataRow In dt.DataRows If dr.Isnull("image_1") = False Then Dim stream As System.IO.Stream Dim bmp As System.Drawing.Bitmap Dim imagebytes As Byte() = dr("image_1") Stream = New System.IO.MemoryStream(imagebytes) bmp = New System.Drawing.Bitmap(stream) bmp.save("c:\\desk\\image_1\\" + dr("style_id") + ".jpg") End If Next End If |
-- 作者:有点蓝 -- 发布时间:2023/5/17 9:00:00 -- 图片是很占内存的,试试 For Each dr As DataRow In dt.DataRows If dr.Isnull("image_1") = False Then Dim bmp As System.Drawing.Bitmap Dim imagebytes As Byte() = dr("image_1") Using Stream As System.IO.Stream = New System.IO.MemoryStream(imagebytes) bmp = New System.Drawing.Bitmap(stream) bmp.save("c:\\desk\\image_1\\" + dr("style_id") + ".jpg") bmp.Dispose End Using End If Next |
-- 作者:kao_go -- 发布时间:2023/5/17 9:10:00 -- 谢谢甜版 试了,还是提示内存溢出,有办法释放内存吗?或者替他方式提取图片来保存
|
-- 作者:有点蓝 -- 发布时间:2023/5/17 9:15:00 -- 2楼代码就是加了释放内存的。如果不行,可能是短时间内处理的图片过多,内存来不及释放。考虑分批处理 其次可能是有过大的图片,这种就没有办法了,Foxtable毕竟不是专业的图片处理软件 再次,sql语句是一次性提取所有数据的,数据太多也会爆内存。考虑分批处理,或者试试这种:http://www.foxtable.com/webhelp/topics/2953.htm,不需要一次性加载全部数据
|
-- 作者:kao_go -- 发布时间:2023/5/17 9:22:00 -- SQlLoadImage也可以用save保存到本地吗? |
-- 作者:有点蓝 -- 发布时间:2023/5/17 9:31:00 -- 加载出来是个Image 对象,再保存就是了。或者使用SQLLoadFile,可以直接保存:http://www.foxtable.com/webhelp/topics/2952.htm |
-- 作者:kao_go -- 发布时间:2023/5/17 10:31:00 -- 甜版,使用以下代码,会提示错误 src = "c:\\desk\\aa\\" + dr("style_id") + ".jpg" Dim img As Image img = dr.SQLLoadImage("image_1") --------------------------- 提示 --------------------------- 未将对象引用设置到对象的实例。 --------------------------- 确定 --------------------------- |
-- 作者:有点蓝 -- 发布时间:2023/5/17 10:35:00 -- 解决问题请直接贴出完整代码,不要老是一截一截的 |
-- 作者:kao_go -- 发布时间:2023/5/17 10:43:00 -- 抱歉 Dim cmd As New SQLCommand cmd.C cmd.CommandText = "s elect top 1 style_id,image_1 from s_style where style_id like \'%19s%\' and image_1 is not null" Dim dt As DataTable = cmd.ExecuteReader Dim src As String If dt.DataRows.Count > 0 Then For Each dr As DataRow In dt.DataRows If dr.Isnull("image_1") = False Then src = "c:\\desk\\aa\\" + dr("style_id") + ".jpg" Dim img As Image img = dr.SQLLoadImage("image_1") MessageBox.Show(src) ‘这个显示前提示错误【未将对象引用设置到对象的实例。】 \' img.Save(src) \' Dim imagebytes As Byte() = dr("image_1") \' Using stream As System.IO.Stream = New System.IO.MemoryStream(imagebytes) \' Dim bmp As System.Drawing.Bitmap = New System.Drawing.Bitmap(stream) \' bmp.save(src) \' bmp.Dispose \' stream.Close \' stream.Dispose \' End Using End If Next End If
|
-- 作者:有点蓝 -- 发布时间:2023/5/17 10:53:00 -- Foxtable提供的二进制用法只能用在主表里,不能用到临时表。先把表格加进来:http://www.foxtable.com/webhelp/topics/2950.htm |