Foxtable(狐表)用户栏目专家坐堂 → 从二进制列提取图片保存,提示内存溢出


  共有4438人关注过本帖树形打印复制链接

主题:从二进制列提取图片保存,提示内存溢出

帅哥哟,离线,有人找我吗?
kao_go
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:579 积分:4940 威望:0 精华:0 注册:2014/4/29 14:32:00
从二进制列提取图片保存,提示内存溢出  发帖心情 Post By: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

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:579 积分:4940 威望:0 精华:0 注册:2014/4/29 14:32:00
  发帖心情 Post By:2023/5/17 9:10:00 [只看该作者]

谢谢甜版
试了,还是提示内存溢出,有办法释放内存吗?
或者替他方式提取图片来保存

 回到顶部
帅哥,在线噢!
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/17 9:15:00 [只看该作者]

2楼代码就是加了释放内存的。如果不行,可能是短时间内处理的图片过多,内存来不及释放。考虑分批处理

其次可能是有过大的图片,这种就没有办法了,Foxtable毕竟不是专业的图片处理软件

再次,sql语句是一次性提取所有数据的,数据太多也会爆内存。考虑分批处理,或者试试这种:http://www.foxtable.com/webhelp/topics/2953.htm,不需要一次性加载全部数据

 回到顶部
帅哥哟,离线,有人找我吗?
kao_go
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:579 积分:4940 威望:0 精华:0 注册:2014/4/29 14:32:00
  发帖心情 Post By:2023/5/17 9:22:00 [只看该作者]

SQlLoadImage也可以用save保存到本地吗?

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/17 9:31:00 [只看该作者]

加载出来是个Image 对象,再保存就是了。或者使用SQLLoadFile,可以直接保存:http://www.foxtable.com/webhelp/topics/2952.htm

 回到顶部
帅哥哟,离线,有人找我吗?
kao_go
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:579 积分:4940 威望:0 精华:0 注册:2014/4/29 14:32:00
  发帖心情 Post By:2023/5/17 10:31:00 [只看该作者]

甜版,使用以下代码,会提示错误
src = "c:\desk\aa\" + dr("style_id") + ".jpg"
            Dim img As Image
            img = dr.SQLLoadImage("image_1")

---------------------------
提示
---------------------------
未将对象引用设置到对象的实例。
---------------------------
确定   
---------------------------


 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/17 10:35:00 [只看该作者]

解决问题请直接贴出完整代码,不要老是一截一截的

 回到顶部
帅哥哟,离线,有人找我吗?
kao_go
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:579 积分:4940 威望:0 精华:0 注册:2014/4/29 14:32:00
  发帖心情 Post By: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

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111390 积分:567014 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/5/17 10:53:00 [只看该作者]

Foxtable提供的二进制用法只能用在主表里,不能用到临时表。先把表格加进来:http://www.foxtable.com/webhelp/topics/2950.htm

 回到顶部
总数 17 1 2 下一页