ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将图片的base64 代码转换为 图片(jpg)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-6-11 13:20 | 显示全部楼层 |阅读模式
本帖最后由 zhxin100 于 2013-6-11 14:43 编辑

excel vba 如何将图片的base64 二进制码 转换为 图片(jpg)
Private Sub main()
   Dim strba As String
    Open ThisWorkbook.Path + "\2.txt" For Binary As #1
        Line Input #1, strba
    Close #1
    Dim bs() As Byte: bs = StrConv(strba, vbFromUnicode)
    Dim fn: fn = ThisWorkbook.Path + "\3.jpg"
    Open fn For Binary Access Write As #100
    Put #100, , bs()
    Close #100
End Sub
上面的2.txt内容为"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgM........",而上面代码生成的3.jpg无法显示,用文本打开发现与2.txt的内容一样,两个文件就只是后缀名不同而已,我的目的是将2.txt的内容转为一张jpg图片,请高手赐教~~~~~

2.rar

5.24 KB, 下载次数: 137

TA的精华主题

TA的得分主题

发表于 2013-6-11 14:31 | 显示全部楼层
发一个示例txt上来看看,方便调试

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-11 14:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Moneky 发表于 2013-6-11 14:31
发一个示例txt上来看看,方便调试

发好了,请高手帮忙看看

TA的精华主题

TA的得分主题

发表于 2013-6-11 15:01 | 显示全部楼层
zhxin100 发表于 2013-6-11 14:44
发好了,请高手帮忙看看

要等等,晚上回去想想,刚刚看了编码规则,头绪已经有了,要回去写代码,现在要上班干活了。

TA的精华主题

TA的得分主题

发表于 2013-6-11 18:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
解码成功,代码还需要完善一下,完善后再发代码。
3.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-11 19:49 | 显示全部楼层
Moneky 发表于 2013-6-11 18:44
解码成功,代码还需要完善一下,完善后再发代码。

{:soso_e179:}
请多多指教

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-11 22:27 | 显示全部楼层
呵呵,自己解决了,贴上代码

Private Function DecodeBase64(ByVal strData As String) As Byte()

    Dim objXML As MSXML2.DOMDocument
    Dim objNode As MSXML2.IXMLDOMElement
   
    ' help from MSXML
    Set objXML = New MSXML2.DOMDocument
    Set objNode = objXML.createElement("b64")
    objNode.DataType = "bin.base64"
    objNode.Text = strData
    DecodeBase64 = objNode.nodeTypedValue
   
    ' thanks, bye
    Set objNode = Nothing
    Set objXML = Nothing

End Function
Private Sub main()
   Dim strba As String
    Open ThisWorkbook.Path + "\2.txt" For Binary As #1
        Line Input #1, strba
    Close #1
    Dim bs() As Byte: bs = DecodeBase64(strba)
    Dim fn: fn = ThisWorkbook.Path + "\3.jpg"
    Open fn For Binary Access Write As #100
    Put #100, , bs()
    Close #100
End Sub

TA的精华主题

TA的得分主题

发表于 2013-6-11 22:48 | 显示全部楼层
zhxin100 发表于 2013-6-11 19:49
请多多指教

代码添加了输入输出接口,可以方便选择输出文件存放的文件夹,也可以选择需要转换的文件(可以选择多个文件)。核心转换过程有两个参数,第一个是txt的fullname,第二个是jpg文件保存的fullname。

在这之前只知道有BASE64编码,但没有真正研究过其原理和方法,通过这个程序也研究了编码规则,对自己也是一种提升。
  1. Sub Txt2Jpg(inFileFullName As String, outFileFullName As String) '转换过程
  2.     Dim a() As Byte, b() As Byte  'a 原始文件字节数组  b 生成的jpg字节数组
  3.     Dim i As Long, j As Long
  4.     Dim FileNo As Long  '文件号
  5.     FileNo = FreeFile
  6.    
  7.     Open inFileFullName For Binary As FileNo '打开文件
  8.         ReDim a(LOF(FileNo) - 1)    '调整a的大小
  9.         Get FileNo, , a             '获取文件内容
  10.     Close FileNo
  11.    
  12.     ReDim b((UBound(a) + 1) * 3 / 4 - 1)    '调整b的大小,b的字节数为原始文件的 3/4    4*6=3*8
  13.     For i = LBound(a) To UBound(a)    '根据对照表将字符ASCII转为0-64
  14.         If a(i) >= 65 And a(i) <= 90 Then
  15.             a(i) = a(i) - 65
  16.         ElseIf a(i) >= 97 And a(i) <= 122 Then
  17.             a(i) = a(i) - 71
  18.         ElseIf a(i) >= 48 And a(i) <= 57 Then
  19.             a(i) = a(i) + 4
  20.         ElseIf a(i) = 43 Then
  21.             a(i) = 62
  22.         ElseIf a(i) = 47 Then
  23.             a(i) = 63
  24.         End If
  25.     Next
  26.    
  27.     For i = LBound(a) To UBound(a) Step 4   '核心转换代码,每4个原始字节转换为3个jpg字节  4个字节每个字节去掉前面两位0,剩下4个6位共24位,按每8位划分为一个新的jpg字节
  28.                                             '原理图示如工作表
  29.         j = (i \ 4) * 3                     'b下标转换
  30.         b(j) = a(i) * 4 + a(i + 1) \ 16     '位移处理生成新的jpg字节
  31.         b(j + 1) = (a(i + 1) Mod 16) * 16 + a(i + 2) \ 4
  32.         b(j + 2) = (a(i + 2) Mod 4) * 64 + a(i + 3)
  33.     Next
  34.   
  35.     FileNo = FreeFile
  36.     Open outFileFullName For Binary As FileNo   '将jpg字节写入文件
  37.         Put FileNo, , b
  38.     Close FileNo
  39. End Sub
  40. Sub Main() '适用于VBA的输入输出设定过程,可以批处理文件(一次选取多个需要处理的文件)
  41.     Dim vFileDLG As FileDialog
  42.     Dim vSeled As Variant
  43.     Dim strPath As String
  44.     Set vFileDLG = Application.FileDialog(msoFileDialogFolderPicker)
  45.     With vFileDLG
  46.         .Title = "Eersoft-选择输出文件保存的文件夹"
  47. getpath:         If .Show = -1 Then
  48.             strPath = .SelectedItems.Item(1)
  49.             strPath = strPath & IIf(Right$(strPath, 1) = "", "", "")
  50.         Else
  51.             If MsgBox("没有选择输出文件存放的文件夹,需要重新选取吗?如果不重新选取程序将退出。", vbQuestion + vbYesNo, "Eersoft-选取输出文件存放文件夹") = vbYes Then
  52.                 GoTo getpath
  53.             Else
  54.                 Exit Sub
  55.             End If
  56.         End If
  57.     End With

  58.     Set vFileDLG = Application.FileDialog(msoFileDialogFilePicker)
  59.     With vFileDLG
  60.         .Title = "Eersoft-选择需要转换的文件"
  61.         .Filters.Add "文本文件", "*.txt"
  62. getfile:         If .Show = -1 Then
  63.             For Each vSeled In .SelectedItems
  64.                 Call Txt2Jpg(CStr(vSeled), strPath & getNameForFullName(CStr(vSeled)) & ".jpg")
  65.             Next vSeled
  66.             MsgBox "所有文件已经转换完成。", vbInformation + vbOKOnly, "Eersoft-转换完成"
  67.         Else
  68.                       If MsgBox("没有选择需要转换的文件,需要重新选取吗?如果不重新选取程序将退出。", vbQuestion + vbYesNo, "Eersoft-选取需要转换的文件") = vbYes Then
  69.                 GoTo getfile
  70.             Else
  71.                 Exit Sub
  72.             End If
  73.   
  74.         End If
  75.     End With
  76.     Set vFileDLG = Nothing
  77. End Sub
  78. Function getNameForFullName(strPath As String) As String '根据带路径的全名获取文件短名称(不带扩展名)
  79.     Dim srr
  80.     srr = Split(strPath, "")
  81.     getNameForFullName = Split(srr(UBound(srr)), ".")(0)
  82. End Function
复制代码

BASE64图片解码.rar

24.42 KB, 下载次数: 492

BASE64图片解码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-6-11 23:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Moneky 发表于 2013-6-11 22:48
代码添加了输入输出接口,可以方便选择输出文件存放的文件夹,也可以选择需要转换的文件(可以选择多个文 ...

仔细看过代码,写的很好,自己手动编码转换,写的很详细,受教了!{:soso_e142:}

TA的精华主题

TA的得分主题

发表于 2015-1-1 14:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
///////////////////////////////测试删除
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 19:44 , Processed in 0.047474 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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