ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] Excel保存单元格区域为图片(支持13种文件格式、背景透明、半透明、矢量图)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2021-9-1 17:00 | 显示全部楼层
本帖已被收录到知识树中,索引项:媒体交互应用
本帖最后由 zldccmx 于 2021-9-1 22:05 编辑
joforn 发表于 2021-9-1 15:01
最近有点忙,主要是客户拖款拖得厉害,今年都没什么时间玩了。网上应该这几个方面的代码都有现成的,自己 ...

image.jpg

这是我目前使用的方法,通过PowerShell 借助注册表,能够顺利将内存中的图片转换成Base64编码。

这有很大的局限性,毕竟PowerShell 不多见,至少XP系统没有。

请大神赐教。

图片转BASE64.zip

13.3 KB, 下载次数: 11

TA的精华主题

TA的得分主题

发表于 2021-9-1 17:54 | 显示全部楼层
                       牛牪犇

TA的精华主题

TA的得分主题

发表于 2021-9-1 23:08 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-1 23:46 | 显示全部楼层
zldccmx 发表于 2021-9-1 17:00
这是我目前使用的方法,通过PowerShell 借助注册表,能够顺利将内存中的图片转换成Base64编码。

...

将一楼的附件中的basSaveRangeToPictrue导入到你自己的文件中,然后再把下面的代码粘贴的至basSaveRangeToPictrue文件尾:

  1. Public Property Get BASE64PictrueFromClipboard(Optional ByVal ByVal strFileExt As String=".bmp", _
  2.         Optional ByVal AlphaColorOrJPEGQuality As Variant, _
  3.         Optional ByVal AlphaDepthOrColorDepth As Long, _
  4.         Optional ByVal ICO_SizeOrTIFF_COMPRESSION As TIFCOMPRESSION, _
  5.         Optional ByVal NewWidth As Long, _
  6.         Optional ByVal NewHeight As Long, _
  7.         Optional ByVal PictureSizeMode As PictureSizeMode = Zoom) As String
  8.       
  9.   #If VBA7 Then
  10.     Dim hBitmap   As LongPtr
  11.     Dim ptrVar    As LongPtr
  12.   #Else
  13.     Dim hBitmap   As Long
  14.     Dim ptrVar    As Long
  15.   #End If

  16.   Dim MetaFile    As METAFILEPICT
  17.   
  18.   Dim lngRet        As Long
  19.   Dim bytFile() As Byte, hFile  As Long
  20.   Dim FileName    As String
  21.   Dim FileName2     As String
  22.   
  23.   On Error Resume Next
  24.   
  25.   lngRet = InStr(strFileExt, vbNullChar)
  26.   If lngRet > 0 Then strFileExt = Left$(strFileExt, lngRet - 1)
  27.   strFileExt = LCase$(Trim$(strFileExt))
  28.   If Len(strFileExt) < 1 Then
  29.     strFileExt = ".bmp"
  30.   Else
  31.     FileName = strFileExt
  32.     strFileExt = GetFileExtension(FileName)
  33.     If Len(strFileExt) < 1 Then
  34.       strFileExt = GetFileExtension("." & FileName)
  35.       If Len(strFileExt) < 1 Then strFileExt = ".bmp"
  36.     End If
  37.   End If
  38.   
  39.   FileName = String(512, vbNullChar): FileName2 = FileName
  40.   If GetTempPath(512, StrPtr(FileName)) Then
  41.     If GetTempFileName(StrPtr(FileName), StrPtr("Ron"), 0, StrPtr(FileName2)) Then
  42.       KillFile FileName2
  43.       If PathRenameExtensionW(StrPtr(FileName2), StrPtr(strFileExt)) Then
  44.         lngRet = 0
  45.         Do While PathFileExistsW(StrPtr(FileName2))
  46.           lngRet = lngRet + 1
  47.           If lngRet > 100 Then Exit Property
  48.           If GetTempFileName(StrPtr(FileName), StrPtr("Ron"), 0, StrPtr(FileName2)) Then
  49.             KillFile FileName2
  50.             If PathRenameExtensionW(StrPtr(FileName2), StrPtr(strFileExt)) = 0 Then Exit Property
  51.           End If
  52.         Loop
  53.       Else
  54.         Exit Property
  55.       End If
  56.     End If
  57.   End If
  58.   
  59.   lngRet = InStr(FileName2, vbNullChar)
  60.   If lngRet > 0 Then
  61.     FileName = Left$(FileName2, lngRet - 1)
  62.   Else
  63.     FileName = FileName2
  64.   End If
  65.   
  66.   Select Case strFileExt
  67.     Case ".emf"
  68.       'EMF格式:背景透明,矢量图。
  69.       If Not (KillFile(FileName)) Then Exit Property
  70.       If IsClipboardFormatAvailable(CF_EnhancedMetafile) Then
  71.         If OpenClipboard(0) Then
  72.           hBitmap = GetClipboardData(CF_EnhancedMetafile)
  73.           lngRet = GetEnhMetaFileBits(hBitmap, 0, 0)
  74.           If (lngRet > 0) Then
  75.             ReDim bytFile(0 To lngRet - 1)
  76.             GetEnhMetaFileBits hBitmap, lngRet, varPtr(bytFile(0))
  77.             hFile = FreeFile
  78.             Open FileName For Binary As hFile
  79.             Put hFile, , bytFile
  80.             Close hFile
  81.             If PathFileExistsW(StrPtr(FileName)) Then
  82.               BASE64PictrueFromClipboard = GetFileBase64(FileName)
  83.               KillFile FileName
  84.             End If
  85.           End If
  86.           CloseClipboard
  87.         End If
  88.       End If
  89.     Case ".wmf"
  90.       'WMF格式:背景透明,矢量图
  91.       If Not (KillFile(FileName)) Then Exit Property
  92.       If IsClipboardFormatAvailable(CF_METAFILEPICT) Then
  93.         If OpenClipboard(0) Then
  94.           hBitmap = GetClipboardData(CF_METAFILEPICT)
  95.           ptrVar = GlobalLock(hBitmap)
  96.           CopyMemory varPtr(MetaFile), ptrVar, LenB(MetaFile)
  97.           lngRet = GetMetaFileBitsEx(MetaFile.hMF, 0, 0)
  98.           If (lngRet > 0) Then
  99.             ReDim bytFile(0 To lngRet - 1)
  100.             GetMetaFileBitsEx MetaFile.hMF, lngRet, varPtr(bytFile(0))
  101.             hFile = FreeFile
  102.             Open FileName For Binary As hFile
  103.             Put hFile, , bytFile
  104.             Close hFile
  105.             If PathFileExistsW(StrPtr(FileName)) Then
  106.               BASE64PictrueFromClipboard = GetFileBase64(FileName)
  107.               KillFile FileName
  108.             End If
  109.           End If
  110.           GlobalUnlock hBitmap
  111.           CloseClipboard
  112.         End If
  113.       End If
  114.     Case Else   '由位图转换
  115.       If OpenClipboard(0) Then
  116.         hBitmap = GetClipboardData(CF_Bitmap)
  117.         CloseClipboard
  118.         If SaveHBitmapToFile(hBitmap, FileName, AlphaColorOrJPEGQuality, AlphaDepthOrColorDepth, _
  119.                               ICO_SizeOrTIFF_COMPRESSION, NewWidth, NewHeight, PictureSizeMode) Then
  120.           BASE64PictrueFromClipboard = GetFileBase64(FileName)
  121.           KillFile FileName
  122.         End If
  123.       End If
  124.   End Select
  125. End Property

复制代码

然后,在你的代码中使用
Debug.Print BASE64PictrueFromClipboard
Debug.Print BASE64PictrueFromClipboard(".jpg")

Debug.Print BASE64PictrueFromClipboard("png")


Text=BASE64PictrueFromClipboard("gif")

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-2 00:00 | 显示全部楼层
本帖最后由 joforn 于 2021-9-2 00:03 编辑

不好意思,由于电脑中存档的文件与一楼附件中的代码不相同,所以上一个函数不能运行,用下面的代码替换就OK了
下载一楼的附件,并将下面的函数粘贴到basSaveRangeToPictrue模块尾端

  1. Public Property Get BASE64PictrueFromClipboard(Optional ByVal strFileExt As String = ".bmp", _
  2.        Optional ByVal AlphaColorOrJPEGQuality As Variant, _
  3.        Optional ByVal AlphaDepthOrColorDepth As Long, _
  4.        Optional ByVal ICO_SizeOrTIFF_COMPRESSION As TIFCOMPRESSION) As String
  5.       
  6.   #If VBA7 Then
  7.     Dim hBitmap   As LongPtr
  8.     Dim ptrVar    As LongPtr
  9.   #Else
  10.     Dim hBitmap   As Long
  11.     Dim ptrVar    As Long
  12.   #End If

  13.   Dim MetaFile    As METAFILEPICT
  14.   
  15.   Dim lngRet        As Long
  16.   Dim bytFile() As Byte, hFile  As Long
  17.   Dim FileName    As String
  18.   Dim FileName2     As String
  19.   
  20.   On Error Resume Next
  21.   
  22.   lngRet = InStr(strFileExt, vbNullChar)
  23.   If lngRet > 0 Then strFileExt = Left$(strFileExt, lngRet - 1)
  24.   strFileExt = LCase$(Trim$(strFileExt))
  25.   If Len(strFileExt) < 1 Then
  26.     strFileExt = ".bmp"
  27.   Else
  28.     FileName = strFileExt
  29.     strFileExt = GetFileExtension(FileName)
  30.     If Len(strFileExt) < 1 Then
  31.       strFileExt = GetFileExtension("." & FileName)
  32.       If Len(strFileExt) < 1 Then strFileExt = ".bmp"
  33.     End If
  34.   End If
  35.   
  36.   FileName = String(512, vbNullChar): FileName2 = FileName
  37.   If GetTempPath(512, StrPtr(FileName)) Then
  38.     If GetTempFileName(StrPtr(FileName), StrPtr("Ron"), 0, StrPtr(FileName2)) Then
  39.       KillFile FileName2
  40.       If PathRenameExtensionW(StrPtr(FileName2), StrPtr(strFileExt)) Then
  41.         lngRet = 0
  42.         Do While PathFileExistsW(StrPtr(FileName2))
  43.           lngRet = lngRet + 1
  44.           If lngRet > 100 Then Exit Property
  45.           If GetTempFileName(StrPtr(FileName), StrPtr("Ron"), 0, StrPtr(FileName2)) Then
  46.             KillFile FileName2
  47.             If PathRenameExtensionW(StrPtr(FileName2), StrPtr(strFileExt)) = 0 Then Exit Property
  48.           End If
  49.         Loop
  50.       Else
  51.         Exit Property
  52.       End If
  53.     End If
  54.   End If
  55.   
  56.   lngRet = InStr(FileName2, vbNullChar)
  57.   If lngRet > 0 Then
  58.     FileName = Left$(FileName2, lngRet - 1)
  59.   Else
  60.     FileName = FileName2
  61.   End If
  62.   
  63.   Select Case strFileExt
  64.     Case ".emf"
  65.       'EMF格式:背景透明,矢量图。
  66.       If Not (KillFile(FileName)) Then Exit Property
  67.       If IsClipboardFormatAvailable(CF_EnhancedMetafile) Then
  68.         If OpenClipboard(0) Then
  69.           hBitmap = GetClipboardData(CF_EnhancedMetafile)
  70.           lngRet = GetEnhMetaFileBits(hBitmap, 0, 0)
  71.           If (lngRet > 0) Then
  72.             ReDim bytFile(0 To lngRet - 1)
  73.             GetEnhMetaFileBits hBitmap, lngRet, VarPtr(bytFile(0))
  74.             hFile = FreeFile
  75.             Open FileName For Binary As hFile
  76.             Put hFile, , bytFile
  77.             Close hFile
  78.             If PathFileExistsW(StrPtr(FileName)) Then
  79.               BASE64PictrueFromClipboard = GetFileBase64(FileName)
  80.               KillFile FileName
  81.             End If
  82.           End If
  83.           CloseClipboard
  84.         End If
  85.       End If
  86.     Case ".wmf"
  87.       'WMF格式:背景透明,矢量图
  88.       If Not (KillFile(FileName)) Then Exit Property
  89.       If IsClipboardFormatAvailable(CF_METAFILEPICT) Then
  90.         If OpenClipboard(0) Then
  91.           hBitmap = GetClipboardData(CF_METAFILEPICT)
  92.           ptrVar = GlobalLock(hBitmap)
  93.           CopyMemory VarPtr(MetaFile), ptrVar, LenB(MetaFile)
  94.           lngRet = GetMetaFileBitsEx(MetaFile.hMF, 0, 0)
  95.           If (lngRet > 0) Then
  96.             ReDim bytFile(0 To lngRet - 1)
  97.             GetMetaFileBitsEx MetaFile.hMF, lngRet, VarPtr(bytFile(0))
  98.             hFile = FreeFile
  99.             Open FileName For Binary As hFile
  100.             Put hFile, , bytFile
  101.             Close hFile
  102.             If PathFileExistsW(StrPtr(FileName)) Then
  103.               BASE64PictrueFromClipboard = GetFileBase64(FileName)
  104.               KillFile FileName
  105.             End If
  106.           End If
  107.           GlobalUnlock hBitmap
  108.           CloseClipboard
  109.         End If
  110.       End If
  111.     Case Else   '由位图转换
  112.       If OpenClipboard(0) Then
  113.         hBitmap = GetClipboardData(CF_Bitmap)
  114.         CloseClipboard
  115.         If SaveBitmapToFile(hBitmap, FileName & vbNullChar & FileName2, AlphaColorOrJPEGQuality, _
  116.                             AlphaDepthOrColorDepth, ICO_SizeOrTIFF_COMPRESSION) Then
  117.           BASE64PictrueFromClipboard = GetFileBase64(FileName)
  118.           KillFile FileName
  119.         End If
  120.       End If
  121.   End Select
  122. End Property

复制代码
调用:
Sub TestOutBASE64()
  Range("L1:R21").Copy
  Debug.Print BASE64PictrueFromClipboard
  Debug.Print BASE64PictrueFromClipboard(".png")  

End Sub



评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-9-2 09:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-9-2 09:19 | 显示全部楼层
joforn 发表于 2021-9-2 00:00
不好意思,由于电脑中存档的文件与一楼附件中的代码不相同,所以上一个函数不能运行,用下面的代码替换就OK ...

衷心感谢大神!

TA的精华主题

TA的得分主题

发表于 2021-9-2 10:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-9-2 14:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-9-3 09:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我来测试一下!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 19:28 , Processed in 0.041111 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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