以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]bitmap 如何释放内存  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=95421)

--  作者:黄训良
--  发布时间:2017/1/19 10:43:00
--  [求助]bitmap 如何释放内存
内存占用一直往上升高,最后报错:内存溢出
百度了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

--  作者:有点色
--  发布时间: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编辑过]

--  作者:黄训良
--  发布时间:2017/1/19 11:15:00
--  

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

--  作者:有点色
--  发布时间:2017/1/19 11:21:00
--  

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


--  作者:黄训良
--  发布时间:2017/1/19 11:27:00
--  
pdf文件:foxtable_help_2013.pdf
生成这个pdf文件的全部图片:endPageNum = pdfFile__1.PageCount
其他没变!


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

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

--  作者:有点色
--  发布时间:2017/1/19 11:31:00
--  

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

 

pageImage = nothing

GC.Collect


--  作者:有点色
--  发布时间:2017/1/19 11:33:00
--  
大文件的处理,尽量不要一次性生成,你可以每次生成100页。
--  作者:黄训良
--  发布时间: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

--  作者:有点色
--  发布时间:2017/1/19 12:08:00
--  

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

 

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


--  作者:黄训良
--  发布时间:2017/1/19 13:08:00
--  
受教了,十分感谢!
[此贴子已经被作者于2017/1/19 13:23:53编辑过]