以文本方式查看主题

-  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