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的得分主题

发表于 2013-4-22 22:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:图像处理和GDI
全都那么牛B,让我等菜鸟羡慕不止。

TA的精华主题

TA的得分主题

发表于 2013-4-23 07:24 | 显示全部楼层
是啊,里面都是老大,希望各位老大能将自己所学写成教程,大家都可以从中吸收到自己所需,对高手们自己来说,也是整理一下自己的思维

TA的精华主题

TA的得分主题

发表于 2013-4-23 09:57 | 显示全部楼层
这个程序说起来也不复杂,涉及到两类API函数,一类是剪贴板函数,用于读取剪贴板中的位图句柄,另外一类是GDI+函数,用于位图到jpg文件的转换,具体代码如下:
  1. Option Explicit
  2. Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function CloseClipboard Lib "user32" () As Long
  4. Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
  5. Private Const CF_BITMAP = 2

  6. Private Type GUID
  7. Data1 As Long
  8. Data2 As Integer
  9. Data3 As Integer
  10. Data4(0 To 7) As Byte
  11. End Type

  12. Private Type GdiplusStartupInput
  13. GdiplusVersion As Long
  14. DebugEventCallback As Long
  15. SuppressBackgroundThread As Long
  16. SuppressExternalCodecs As Long
  17. End Type

  18. Private Type EncoderParameter
  19. GUID As GUID
  20. NumberOfValues As Long
  21. type As Long
  22. Value As Long
  23. End Type

  24. Private Type EncoderParameters
  25. Count As Long
  26. Parameter As EncoderParameter
  27. End Type

  28. Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long
  29. Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
  30. Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
  31. Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal filename As Long, clsidEncoder As GUID, encoderParams As Any) As Long
  32. Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
  33. Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hPal As Long, BITMAP As Long) As Long

  34. Sub test()
  35.     Select Case CliptoJPG("c:\test.jpg")
  36.         Case 0:
  37.             MsgBox "剪贴板图片已保存"
  38.         Case 1:
  39.             MsgBox "剪贴板图片保存失败"
  40.         Case 2:
  41.             MsgBox "剪贴板中无图片"
  42.         Case 3:
  43.             MsgBox "剪贴板无法打开,可能被其他程序所占用"
  44.     End Select
  45. End Sub


  46. Private Function CliptoJPG(ByVal destfilename As String, Optional ByVal quality As Byte = 80) As Integer
  47. '*****该函数用于取出剪贴板中图片转换为jpg文件另存到指定路径****
  48. '参数说明:
  49. '     destfilename:要保存的jpg文件的完整路径,必要参数;
  50. '     quality: jpg文件的质量,0-100之间的数值,数值越大,图片质量越高
  51. '返回值:
  52. '     0-保存成功;1-保存失败;2-剪贴板中无位图数据;3-无法打开剪贴板

  53.     Dim tSI As GdiplusStartupInput
  54.     Dim lRes As Long
  55.     Dim lGDIP As Long
  56.     Dim lBitmap As Long
  57.     Dim hBmp As Long
  58.    
  59.     '尝试打开剪贴板
  60.     If OpenClipboard(0) Then
  61.         '尝试取出剪贴板中位图的句柄
  62.         hBmp = GetClipboardData(CF_BITMAP)
  63.         '如果hBmp为0,说明剪贴板中没有存放图片
  64.         If hBmp = 0 Then
  65.             CliptoJPG = 2
  66.             CloseClipboard
  67.             Exit Function
  68.         End If
  69.         CloseClipboard
  70.     Else   '如果openclipboard返回0(False),说明剪贴板被其他程序所占用
  71.         CliptoJPG = 3
  72.         Exit Function
  73.     End If
  74.    
  75.     '初始化 GDI+
  76.     tSI.GdiplusVersion = 1
  77.     lRes = GdiplusStartup(lGDIP, tSI, 0)
  78.      
  79.     If lRes = 0 Then
  80.         '从句柄创建 GDI+ 图像
  81.         lRes = GdipCreateBitmapFromHBITMAP(hBmp, 0, lBitmap)
  82.          
  83.         If lRes = 0 Then
  84.             Dim tJpgEncoder As GUID
  85.             Dim tParams As EncoderParameters
  86.             
  87.             '初始化解码器的GUID标识
  88.             CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
  89.             
  90.             '设置解码器参数
  91.             tParams.Count = 1
  92.             With tParams.Parameter ' Quality
  93.                 '得到Quality参数的GUID标识
  94.                 CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
  95.                 .NumberOfValues = 1
  96.                 .type = 4
  97.                 .Value = VarPtr(quality)
  98.             End With
  99.             
  100.             '保存图像
  101.             lRes = GdipSaveImageToFile(lBitmap, StrPtr(destfilename), tJpgEncoder, tParams)
  102.             If lRes = 0 Then
  103.                 CliptoJPG = 0  '转换成功
  104.             Else
  105.                 CliptoJPG = 1  '转换失败
  106.             End If
  107.             
  108.             '销毁GDI+图像
  109.             GdipDisposeImage lBitmap
  110.         End If
  111.          
  112.         '销毁 GDI+
  113.         GdiplusShutdown lGDIP
  114.     End If
  115. End Function
复制代码

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-23 12:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小fisher 发表于 2013-4-23 09:57
这个程序说起来也不复杂,涉及到两类API函数,一类是剪贴板函数,用于读取剪贴板中的位图句柄,另外一类是G ...

最近难觅fisher大师踪影,感谢莅临指导。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-24 17:42 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-24 17:43 | 显示全部楼层
amesman 发表于 2013-4-2 20:03
交流交流,下面是一个截图软件:
http://www.crsky.com/soft/39507.html

欢迎测试
http://club.excelhome.net/thread-1007556-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-24 17:45 | 显示全部楼层
cumulonimbus 发表于 2013-4-22 22:58
全都那么牛B,让我等菜鸟羡慕不止。

欢迎测试
http://club.excelhome.net/thread-1007556-1-1.html

TA的精华主题

TA的得分主题

发表于 2013-5-22 15:57 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-9-10 14:28 | 显示全部楼层
kangatang 发表于 2013-4-24 17:45
欢迎测试
http://club.excelhome.net/thread-1007556-1-1.html

抱歉,本帖要求阅读权限高于 255 才能浏览

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-13 17:21 | 显示全部楼层
dy_ysl 发表于 2013-9-10 14:28
抱歉,本帖要求阅读权限高于 255 才能浏览

我把那个帖子的VBS代码加密了,所以进去了也看不到代码。这是我个人用的,否面影响就不再扩大了。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 01:27 , Processed in 0.041985 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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