Foxtable(狐表)用户栏目专家坐堂 → [求助]bitmap 如何释放内存


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

主题:[求助]bitmap 如何释放内存

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


加好友 发短信
等级:五尾狐 帖子:1100 积分:8985 威望:0 精华:0 注册:2014/3/15 14:36:00
[求助]bitmap 如何释放内存  发帖心情 Post By:2017/1/19 10:43:00 [只看该作者]

内存占用一直往上升高,最后报错:内存溢出
百度了N个方法,无果,请指点!
内存升高情况如图:

图片点击可在新窗口打开查看此主题相关图片如下:内存升高图片.gif
图片点击可在新窗口打开查看

代码如下:
Public Enum Definition
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Six = 6
Seven = 7
Eight = 8
Nine = 9
Ten = 10
End Enum
''' <summary>
''' 将PDF文档转换为图片的方法
''' </summary>
''' <param name="pdfInputPath">PDF文件路径</param>
''' <param name="imageOutputPath">图片输出路径</param>
''' <param name="imageName">生成图片的名字</param>
''' <param name="startPageNum">从PDF文档的第几页开始转换</param>
''' <param name="endPageNum">从PDF文档的第几页开始停止转换</param>
''' <param name="imageFormat">设置所需图片格式</param>
''' <param name="definition">设置图片的清晰度,数字越大越清晰</param>
Public Sub ConvertPDF2Image(pdfInputPath As String, imageOutputPath As String, imageName As String, startPageNum As Integer, endPageNum As Integer, imageFormat As ImageFormat, _
definition As Definition)
Dim pdfFile__1 As O2S.Components.PDFRender4NET.PDFFile = O2S.Components.PDFRender4NET.PDFFile.Open(pdfInputPath)
If Not IO.Directory.Exists(imageOutputPath) Then
    IO.Directory.CreateDirectory(imageOutputPath)
End If
'' validate pageNum
If startPageNum <= 0 Then
    startPageNum = 1
End If
If endPageNum > pdfFile__1.PageCount Then
    endPageNum = pdfFile__1.PageCount
End If
If startPageNum > endPageNum Then
    Dim tempPageNum As Integer = startPageNum
    startPageNum = endPageNum
    endPageNum = startPageNum
End If


For i As Integer = startPageNum To endPageNum
    Dim pageImage As System.Drawing.Bitmap = pdfFile__1.GetPageImage(i - 1, 56 * CInt(definition))
    pageImage.Save(imageOutputPath & imageName & i.ToString() & "." & imageFormat.ToString(), imageFormat)
    ‘Application.DoEvents()
    'pageImage = Nothing      ‘报错:未引用到实例
    'System.Drawing.Bitmap.recycle    ’提示:不是Bitmap的成员
    pageImage.Dispose()
    GC.Collect()  
p.Value = i
Next
pdfFile__1.Dispose()
End Sub

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/19 10:55:00 [只看该作者]

代码这样写

 

Public Enum Definition
 One = 1
 Two = 2
 Three = 3
 Four = 4
 Five = 5
 Six = 6
 Seven = 7
 Eight = 8
 Nine = 9
 Ten = 10
End Enum

''' <summary>
''' 将PDF文档转换为图片的方法
''' </summary>
''' <param name="pdfInputPath">PDF文件路径</param>
''' <param name="imageOutputPath">图片输出路径</param>
''' <param name="imageName">生成图片的名字</param>
''' <param name="startPageNum">从PDF文档的第几页开始转换</param>
''' <param name="endPageNum">从PDF文档的第几页开始停止转换</param>
''' <param name="imageFormat">设置所需图片格式</param>
''' <param name="definition">设置图片的清晰度,数字越大越清晰</param>
Public Sub ConvertPDF2Image(pdfInputPath As String, imageOutputPath As String, imageName As String, startPageNum As Integer, endPageNum As Integer, imageFormat As ImageFormat, _
 definition As Definition)
 Dim pdfFile__1 As O2S.Components.PDFRender4NET.PDFFile = O2S.Components.PDFRender4NET.PDFFile.Open(pdfInputPath)

 If Not IO.Directory.Exists(imageOutputPath) Then
  IO.Directory.CreateDirectory(imageOutputPath)
 End If

 ' validate pageNum
 If startPageNum <= 0 Then
  startPageNum = 1
 End If

 If endPageNum > pdfFile__1.PageCount Then
  endPageNum = pdfFile__1.PageCount
 End If

 If startPageNum > endPageNum Then
  Dim tempPageNum As Integer = startPageNum
  startPageNum = endPageNum
  endPageNum = startPageNum
 End If

 ' start to convert each page
 For i As Integer = startPageNum To endPageNum
  Dim pageImage As Bitmap = pdfFile__1.GetPageImage(i - 1, 56 * CInt(definition))
  pageImage.Save(imageOutputPath & imageName & i.ToString() & "." & imageFormat.ToString(), imageFormat)
  pageImage.Dispose()
    pageImage = nothing

 GC.Collect
 Next

 pdfFile__1.Dispose()
  pdfFile__1 = Nothing
 GC.Collect
End Sub

 

 

我这样测试

 

For i As Integer = 1 To 100
ConvertPDF2Image("d:\test.pdf", "d:\test", "test", 1, 5, ImageFormat.Jpeg, Definition.One)
Next

[此贴子已经被作者于2017/1/19 11:31:03编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1100 积分:8985 威望:0 精华:0 注册:2014/3/15 14:36:00
  发帖心情 Post By:2017/1/19 11:15:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:还是回收不了.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/19 11:21:00 [只看该作者]

你如何调用?代码和pdf文件发上来。


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


加好友 发短信
等级:五尾狐 帖子:1100 积分:8985 威望:0 精华:0 注册:2014/3/15 14:36:00
  发帖心情 Post By:2017/1/19 11:27:00 [只看该作者]

pdf文件:foxtable_help_2013.pdf
生成这个pdf文件的全部图片:endPageNum = pdfFile__1.PageCount
其他没变!


图片点击可在新窗口打开查看此主题相关图片如下:捕获0000.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2017/1/19 11:27:51编辑过]

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/19 11:31:00 [只看该作者]

一个文件太大,循环里面回收内存。

 

pageImage = nothing

GC.Collect


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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/19 11:33:00 [只看该作者]

大文件的处理,尽量不要一次性生成,你可以每次生成100页。

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


加好友 发短信
等级:五尾狐 帖子:1100 积分:8985 威望:0 精华:0 注册:2014/3/15 14:36:00
  发帖心情 Post By:2017/1/19 12:04:00 [只看该作者]

问题是这样解决的,全局代码作相应改动,但是bitmap 如何释放内存的方法未找到!
Dim imageOutputPath As String = "d:\foxtable_help_2013\"
Dim pdfInputPath As String = "d:\foxtable_help_2013.pdf"
Dim pdfFile__1 As O2S.Components.PDFRender4NET.PDFFile = O2S.Components.PDFRender4NET.PDFFile.Open(pdfInputPath)
Dim Endpage As Integer = pdfFile__1.PageCount
For i As Integer = 1 To Endpage
ConvertPDF2Image(pdfInputPath,imageOutputPath, "foxtable", i,i, ImageFormat.Jpeg, Definition.One)
Next

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2017/1/19 12:08:00 [只看该作者]

执行 ConvertPDF2Image 的时候,GetPageImage得到的图片,只有在PDFFile对象dispose的时候,才会释放。

 

也就是说PDFFile对象,尽量不要超出你的内存限制。比如控制在100页以内基本就没问题。


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


加好友 发短信
等级:五尾狐 帖子:1100 积分:8985 威望:0 精华:0 注册:2014/3/15 14:36:00
  发帖心情 Post By:2017/1/19 13:08:00 [只看该作者]

受教了,十分感谢!
[此贴子已经被作者于2017/1/19 13:23:53编辑过]

 回到顶部