把数据库里的图片库动态生成缩略图
有8万条图片记录
循环动态生成
但随着运行,很快占满了内存
然后就内存不足了
代码如下:
For i = startId To ProductTable.Rows.Count - 1
Try
Dim imagedata As Byte(), streamImage As Stream
imagedata = theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductPicture
Dim ms As MemoryStream = New MemoryStream(imagedata)
Dim img As Image = Image.FromStream(ms)
Dim imgPath As String = "ProductImage/"
If Not Directory.Exists(imgPath) Then
Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory(imgPath)
End If
Dim iWidth As Integer = img.Width
Dim iHeight As Integer = img.Height
Dim aimWidth = 75
Dim aimHeight = (aimWidth / iWidth) * iHeight
img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero)
img.Save(imgPath & ProductTable.Rows(i).Item("ProductId") & ".jpg")
ms.Close()
img.Dispose()
Catch ex As Exception
If Not Directory.Exists("ImgLog/") Then
Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory("ImgLog/")
End If
Dim fileInfo As FileInfo = New FileInfo("ImgLog/" & ProductTable.Rows(i).Item("ProductId") & ".log")
fileInfo.Delete()
Dim fw As StreamWriter
Try
fw = New StreamWriter("Log/" & ProductTable.Rows(i).Item("ProductId") & ".log", True, System.Text.Encoding.GetEncoding("gb2312"))
fw.WriteLine("商品ID:" & theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductId & ";类目名称:" & theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductName & ";详细内容:" & ex.ToString)
fw.Close()
Catch exnext As Exception End Try End Try Dim fileInfoStart As FileInfo = New FileInfo("StartId.txt")
fileInfoStart.Delete()
Dim fwStart As StreamWriter
fwStart = New StreamWriter("StartId.txt", True)
fwStart.WriteLine(i)
fwStart.Close()
Next
有8万条图片记录
循环动态生成
但随着运行,很快占满了内存
然后就内存不足了
代码如下:
For i = startId To ProductTable.Rows.Count - 1
Try
Dim imagedata As Byte(), streamImage As Stream
imagedata = theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductPicture
Dim ms As MemoryStream = New MemoryStream(imagedata)
Dim img As Image = Image.FromStream(ms)
Dim imgPath As String = "ProductImage/"
If Not Directory.Exists(imgPath) Then
Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory(imgPath)
End If
Dim iWidth As Integer = img.Width
Dim iHeight As Integer = img.Height
Dim aimWidth = 75
Dim aimHeight = (aimWidth / iWidth) * iHeight
img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero)
img.Save(imgPath & ProductTable.Rows(i).Item("ProductId") & ".jpg")
ms.Close()
img.Dispose()
Catch ex As Exception
If Not Directory.Exists("ImgLog/") Then
Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory("ImgLog/")
End If
Dim fileInfo As FileInfo = New FileInfo("ImgLog/" & ProductTable.Rows(i).Item("ProductId") & ".log")
fileInfo.Delete()
Dim fw As StreamWriter
Try
fw = New StreamWriter("Log/" & ProductTable.Rows(i).Item("ProductId") & ".log", True, System.Text.Encoding.GetEncoding("gb2312"))
fw.WriteLine("商品ID:" & theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductId & ";类目名称:" & theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductName & ";详细内容:" & ex.ToString)
fw.Close()
Catch exnext As Exception End Try End Try Dim fileInfoStart As FileInfo = New FileInfo("StartId.txt")
fileInfoStart.Delete()
Dim fwStart As StreamWriter
fwStart = New StreamWriter("StartId.txt", True)
fwStart.WriteLine(i)
fwStart.Close()
Next
解决方案 »
- WinForm一个窗体接收输入数据,数据属于不同表。
- 为什么ctrl+v,或x复制了粘贴时总是空的(丢失),不管是vs.net还是DreamWeaver
- 如何在属性编辑器里不显示从父类继承的属性?
- 100分求解事件的含义,高手帮忙解释基本概念
- 把\n\r这种转义字符,换成真正对应的字符,谁知道这怎么解决?
- 急!~~在線等!~~~~~~~~~~`水晶报表加载失败,help!~~~~~~~~~~~
- 如: 发票的税率是7%, 那么开5000的票后要额外交5000*7%=350 元的税 我想把350元的税也开到票里,不知票要开多少金额才对?? ....
- 如何写NUnit验证实体对象符合XSD(schema)所定义的结构?谢谢!
- 急,求borland together for vs.net的注册文件?
- 怎么才能不调用基类的构造函数啊
- 遇到问题了, Winform程序中下载一段程序遇到的问题,牛人们进来看看
- 请问鼠标右键的“复制”项是如何实现的?
img.Dispose()
1.Dim ms As MemoryStream = New MemoryStream(imagedata)的地方,imagedata指针只向的内存如何释放?ms.close可以吗?
2.img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero),这个赋值语句把原来的img指向图片给丢掉了。可以这样写dim imgthumb as Image = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero) ; img.dispose
能说的更清楚一点吗 ?
試試將
Dim imagedata As Byte(), streamImage As Stream
imagedata = theProduct.GetDetails(ProductTable.Rows(i).Item("ProductId")).ProductPicture
Dim ms As MemoryStream = New MemoryStream(imagedata)
Dim img As Image = Image.FromStream(ms)
Dim imgPath As String = "ProductImage/"
If Not Directory.Exists(imgPath) Then
Dim imgDirectory As DirectoryInfo = Directory.CreateDirectory(imgPath)
End If
Dim iWidth As Integer = img.Width
Dim iHeight As Integer = img.Height
Dim aimWidth = 75
Dim aimHeight = (aimWidth / iWidth) * iHeight
img = img.GetThumbnailImage(aimWidth, aimHeight, Nothing, (New IntPtr).Zero)
img.Save(imgPath & ProductTable.Rows(i).Item("ProductId") & ".jpg")
ms.Close()
img.Dispose()
放到別一個function中,返回一個路徑就可以了.
然后在原sub中用System.GC.Collect()強制清除內存.
我按照你说的方式进行了操作,但是我的循环也就停止了
程序不再继续工作了