当前位置:   article > 正文

20170706wdVBA保存图片到本地API

vba浮动图片保存到本地
  1. Private Type GUID
  2. Data1 As Long
  3. Data2 As Integer
  4. Data3 As Integer
  5. Data4(0 To 7) As Byte
  6. End Type
  7. Private Type GdiplusStartupInput
  8. GdiplusVersion As Long
  9. DebugEventCallback As Long
  10. SuppressBackgroundThread As Long
  11. SuppresexternalCodecs As Long
  12. End Type
  13. Private Type EncoderParameter
  14. GUID As GUID
  15. NumberOfValues As Long
  16. type As Long
  17. Value As Long
  18. End Type
  19. Private Type EncoderParameters
  20. Count As Long
  21. Parameter As EncoderParameter
  22. End Type
  23. Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long
  24. Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
  25. Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hpal As Long, Bitmap As Long) As Long
  26. Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
  27. Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal FileName As Long, clsidEncoder As GUID, encoderParams As Any) As Long
  28. Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
  29. Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Integer) As Long
  30. Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Integer) As Long
  31. Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
  32. Private Declare Function CloseClipboard Lib "user32" () As Long
  33. Const CF_BITMAP = 2
  34. Public Sub SavePictures()
  35. Call ConvertShapeToInline
  36. Call SavePictureByApi
  37. End Sub
  38. Private Sub SavePictureByApi()
  39. Dim tSI As GdiplusStartupInput
  40. Dim lRes As Long
  41. Dim lGDIP As Long
  42. Dim lBitmap As Long
  43. Dim hBitmap As Long
  44. Dim FileName As String
  45. Dim inSh As InlineShape, N As Long
  46. N = 0
  47. 'Documents.Open ("C:\Brildo\Test.docx")
  48. ReDim PicName(1 To 1) As String
  49. For Each inSh In ActiveDocument.InlineShapes
  50. '如果是shape,此处改为activedocument.Shapes,当然inSh的声明也要改
  51. N = N + 1
  52. ReDim Preserve PicName(1 To N)
  53. PicName(N) = FirstName & Format(N, "0000") & ".jpg"
  54. Debug.Print N
  55. FileName = ActiveDocument.Path & "\" & PicName(N)
  56. If Dir(FileName) <> "" Then Kill FileName
  57. inSh.Range.CopyAsPicture
  58. '如果为shape,CopyAsPicture方法无效,可能因为shape本身就是pic,
  59. '所以对于shape直接select,再copy,即以图片形式装入了粘贴板,
  60. '后续操作相同。
  61. OpenClipboard 0&
  62. hBitmap = GetClipboardData(CF_BITMAP)
  63. CloseClipboard
  64. tSI.GdiplusVersion = 1
  65. lRes = GdiplusStartup(lGDIP, tSI, 0)
  66. If lRes = 0 Then
  67. lRes = GdipCreateBitmapFromHBITMAP(hBitmap, 0, lBitmap)
  68. If lRes = 0 Then
  69. Dim tJpgEncoder As GUID
  70. Dim tParams As EncoderParameters
  71. CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
  72. tParams.Count = 1
  73. With tParams.Parameter
  74. CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
  75. .NumberOfValues = 1
  76. .type = 4
  77. .Value = VarPtr(100)
  78. End With
  79. lRes = GdipSaveImageToFile(lBitmap, StrPtr(FileName), tJpgEncoder, tParams)
  80. GdipDisposeImage lBitmap
  81. End If
  82. GdiplusShutdown lGDIP
  83. End If
  84. Next inSh
  85. End Sub
  86. Private Sub ConvertShapeToInline()
  87. Dim shp As Shape
  88. Dim N As Long
  89. If ActiveDocument.Shapes.Count = 0 Then Exit Sub
  90. On Error Resume Next '防止一些转化失败
  91. For Each shp In ActiveDocument.Shapes
  92. Debug.Print "正在转换"; N
  93. N = N + 1
  94. shp.ConvertToInlineShape
  95. Next shp
  96. On Error GoTo 0
  97. End Sub

  

转载于:https://www.cnblogs.com/nextseven/p/7129072.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/448419
推荐阅读
相关标签
  

闽ICP备14008679号