ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: kangatang

[求助] 截屏后,如何将系统剪贴板上的数据保存为JPG文件

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-7-28 07:57 | 显示全部楼层
本帖已被收录到知识树中,索引项:图像处理和GDI
小fisher 发表于 2013-4-23 09:57
这个程序说起来也不复杂,涉及到两类API函数,一类是剪贴板函数,用于读取剪贴板中的位图句柄,另外一类是G ...

太强大了~!还可以保存为bmp等格式么?

TA的精华主题

TA的得分主题

发表于 2017-5-12 15:51 | 显示全部楼层
小fisher 发表于 2013-4-23 09:57
这个程序说起来也不复杂,涉及到两类API函数,一类是剪贴板函数,用于读取剪贴板中的位图句柄,另外一类是G ...

大师,向您请教下,如果在excel里插入的是包(Packer)对象,文件类型为mp3文件,怎么保存这个包对象?听说你这某个网站写了个windows剪贴板,但是找不到了。请求赐教!感谢大师!
我的音乐文件太大,上传不上去,一时找不到代替的。

TA的精华主题

TA的得分主题

发表于 2018-6-28 15:12 | 显示全部楼层
请教一下大神 这代码在32位EXCEL中运行是没有问题的,但在64位系统中报错.CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder 说是类型不匹配.如何修改完善代码.

TA的精华主题

TA的得分主题

发表于 2019-3-24 12:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-4-18 10:10 | 显示全部楼层
小fisher 发表于 2013-4-23 09:57
这个程序说起来也不复杂,涉及到两类API函数,一类是剪贴板函数,用于读取剪贴板中的位图句柄,另外一类是G ...

大神,我用你的代码64位上 能正常运行就保存不了图片,我的目的是把图片上传到网站进行文字识别,这个可以不用保存到本地吗,我联系不上你,折腾好久,请你帮忙

TA的精华主题

TA的得分主题

发表于 2021-1-7 21:23 | 显示全部楼层
YDH318 发表于 2018-6-28 15:12
请教一下大神 这代码在32位EXCEL中运行是没有问题的,但在64位系统中报错.CLSIDFromString StrPtr("{557CF40 ...

您好,您的问题后来解决了吗?我也碰到这个问题了

TA的精华主题

TA的得分主题

发表于 2021-11-27 10:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我也遇到同樣的問題,64位win10系統,能運行,跑完程序,但是提示保存失敗

TA的精华主题

TA的得分主题

发表于 2022-4-27 12:13 | 显示全部楼层
小fisher 发表于 2013-4-23 09:57
这个程序说起来也不复杂,涉及到两类API函数,一类是剪贴板函数,用于读取剪贴板中的位图句柄,另外一类是G ...

這個函數要是能64bit上運行就完美了,我在64bit上總是截圖失敗.

TA的精华主题

TA的得分主题

发表于 2022-4-27 20:58 | 显示全部楼层
伶俐的毛豆 发表于 2022-4-27 12:13
這個函數要是能64bit上運行就完美了,我在64bit上總是截圖失敗.

回复33、35、36、37楼,64位代码如下:
  1. Option Explicit
  2. Private Type GUID
  3. Data1 As Long
  4. Data2 As Integer
  5. Data3 As Integer
  6. Data4(0 To 7) As Byte
  7. End Type
  8. #If VBA7 Then
  9. Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
  10. Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
  11. Private Declare PtrSafe Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long

  12. Private Declare PtrSafe Function GdiplusStartup Lib "GDIPlus" (token As LongPtr, inputbuf As GdiplusStartupInput, ByVal outputbuf As LongPtr) As LongPtr
  13. Private Declare PtrSafe Function GdiplusShutdown Lib "GDIPlus" (ByVal token As LongPtr) As LongPtr
  14. Private Declare PtrSafe Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As LongPtr) As LongPtr
  15. Private Declare PtrSafe Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As LongPtr, ByVal filename As LongPtr, clsidEncoder As GUID, encoderParams As Any) As LongPtr
  16. Private Declare PtrSafe Function CLSIDFromString Lib "ole32" (ByVal str As LongPtr, id As GUID) As LongPtr
  17. Private Declare PtrSafe Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As LongPtr, ByVal hPal As LongPtr, BITMAP As LongPtr) As LongPtr
  18. Private Type EncoderParameter
  19. GUID As GUID
  20. NumberOfValues As Long
  21. type As Long
  22. Value As LongPtr
  23. End Type
  24. Private Type GdiplusStartupInput
  25. GdiplusVersion As Long
  26. DebugEventCallback As LongPtr
  27. SuppressBackgroundThread As Long
  28. SuppressExternalCodecs As Long
  29. End Type
  30. #Else
  31. Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
  32. Private Declare Function CloseClipboard Lib "user32" () As Long
  33. Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long

  34. Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long
  35. Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
  36. Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
  37. Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal filename As Long, clsidEncoder As GUID, encoderParams As Any) As Long
  38. Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
  39. Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hPal As Long, BITMAP As Long) As Long
  40. Private Type EncoderParameter
  41. GUID As GUID
  42. NumberOfValues As Long
  43. type As Long
  44. Value As Long
  45. End Type
  46. Private Type GdiplusStartupInput
  47. GdiplusVersion As Long
  48. DebugEventCallback As Long
  49. SuppressBackgroundThread As Long
  50. SuppressExternalCodecs As Long
  51. End Type
  52. #End If

  53. Private Const CF_BITMAP = 2


  54. Private Type EncoderParameters
  55. Count As Long
  56. Parameter As EncoderParameter
  57. End Type


  58. Sub test()
  59.     Select Case CliptoJPG("c:\test.jpg")
  60.         Case 0:
  61.             MsgBox "剪贴板图片已保存"
  62.         Case 1:
  63.             MsgBox "剪贴板图片保存失败"
  64.         Case 2:
  65.             MsgBox "剪贴板中无图片"
  66.         Case 3:
  67.             MsgBox "剪贴板无法打开,可能被其他程序所占用"
  68.         Case 4:
  69.             MsgBox "GDI+错误"
  70.     End Select
  71. End Sub


  72. Private Function CliptoJPG(ByVal destfilename As String, Optional ByVal quality As Byte = 80) As Integer
  73. '*****该函数用于取出剪贴板中图片转换为jpg文件另存到指定路径****
  74. '参数说明:
  75. '     destfilename:要保存的jpg文件的完整路径,必要参数;
  76. '     quality: jpg文件的质量,0-100之间的数值,数值越大,图片质量越高
  77. '返回值:
  78. '     0-保存成功;1-保存失败;2-剪贴板中无位图数据;3-无法打开剪贴板
  79.     Dim tSI As GdiplusStartupInput
  80. #If VBA7 Then
  81.     Dim lRes As LongPtr
  82.     Dim lGDIP As LongPtr
  83.     Dim lBitmap As LongPtr
  84.     Dim hBmp As LongPtr
  85. #Else
  86.     Dim lRes As Long
  87.     Dim lGDIP As Long
  88.     Dim lBitmap As Long
  89.     Dim hBmp As Long
  90. #End If

  91.     '尝试打开剪贴板
  92.     If OpenClipboard(0) Then
  93.         '尝试取出剪贴板中位图的句柄
  94.         hBmp = GetClipboardData(CF_BITMAP)
  95.         '如果hBmp为0,说明剪贴板中没有存放图片
  96.         If hBmp = 0 Then
  97.             CliptoJPG = 2
  98.             CloseClipboard
  99.             Exit Function
  100.         End If
  101.         CloseClipboard
  102.     Else   '如果openclipboard返回0(False),说明剪贴板被其他程序所占用
  103.         CliptoJPG = 3
  104.         Exit Function
  105.     End If
  106.    
  107.     '初始化 GDI+
  108.     tSI.GdiplusVersion = 1
  109.     lRes = GdiplusStartup(lGDIP, tSI, 0)
  110.      
  111.     If lRes = 0 Then
  112.         '从句柄创建 GDI+ 图像
  113.         lRes = GdipCreateBitmapFromHBITMAP(hBmp, 0, lBitmap)
  114.          
  115.         If lRes = 0 Then
  116.             Dim tJpgEncoder As GUID
  117.             Dim tParams As EncoderParameters
  118.             
  119.             '初始化解码器的GUID标识
  120.             CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
  121.             
  122.             '设置解码器参数
  123.             tParams.Count = 1
  124.             With tParams.Parameter ' Quality
  125.                 '得到Quality参数的GUID标识
  126.                 CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
  127.                 .NumberOfValues = 1
  128.                 .type = 4
  129.                 .Value = VarPtr(quality)
  130.             End With
  131.             
  132.             '保存图像
  133.             lRes = GdipSaveImageToFile(lBitmap, StrPtr(destfilename), tJpgEncoder, tParams)
  134.             If lRes = 0 Then
  135.                 CliptoJPG = 0  '转换成功
  136.             Else
  137.                 CliptoJPG = 1  '转换失败
  138.             End If
  139.             
  140.             '销毁GDI+图像
  141.             GdipDisposeImage lBitmap
  142.         End If
  143.          
  144.         '销毁 GDI+
  145.         GdiplusShutdown lGDIP
  146.     Else
  147.         CliptoJPG = 4
  148.     End If
  149. End Function
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-11-12 22:47 | 显示全部楼层
这个支持一下  64位困扰好久 终于找到接解决方案
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 12:50 , Processed in 0.037929 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表