批处理base64图像解码

时间:2018-09-23 00:57:28

标签: html bash base64 jpeg

我有一个很大的(117MB!)html文件,其中有成千上万个图像编码为base64,我想将它们解码为JPG,但是我的bash-fu不足以做到这一点,而且我还没有能够在线找到答案

3 个答案:

答案 0 :(得分:1)

通常,无法使用正则表达式正确解析HTML,但是如果您使用特定的受限格式,则可以使用它。

给出一个简单的格式,例如

<body>
<img src="data:image/jpeg;base64,DpFDPGOIg3renreGR43LGLJKds==">
<img src="data:image/jpeg;base64,DpFDPGOIg3renreGR43LGLJKds=="><img src="data:image/jpeg;base64,DpFaPGOIg3renreGR43LGLJKds==">
<div><img src="data:image/jpeg;base64,DpFdPGOIg3renreGR43LGLJKds=="></div>
</body>

以下可以提取数据

i=0; awk 'BEGIN{RS="<"} /="data:image\/jpeg;base64,[^\"]*"/ { match($0, /="data:image\/jpeg;base64,([^\"]*)"/, data); print data[1]; }' test.html | while read d; do echo $d  | base64 -d > $i.jpg; i=$(($i+1)); done

要将其分解:

i=0保留一个计数器,以便我们为每个图像输出不同的文件名。

awk 'BEGIN{RS="<"}运行awk,并将“记录分隔符”从默认换行符更改为<,因此我们始终将每个HTML元素视为一个单独的记录。

/="data:image\/jpeg;base64,[^\"]*"/仅对嵌入了base64 jpeg数据的记录运行以下命令。

{ match($0, /="data:image\/jpeg;base64,([^\"]*)"/, data); print data[1]; }'拔出数据本身,将其与逗号和尾引号之间的括号匹配的部分取出,然后打印出来。

test.html仅输入文件名。

| while read d; do将输出的base64数据传递到循环中。 read会将每一行放入d,直到没有更多输入为止。

echo $d | base64 -d > img$i.jpg;通过base64解码器传递当前图像,并将输出存储到文件中。

i=$(($i+1));递增以更改下一个文件名。

done完成。

有些事情可能在这里可以做得更好:

  • 应该有一种方法使行匹配的正则表达式直接捕获base64数据,而不是在调用match()函数的过程中重复正则表达式,但是我无法使其正常工作。 / li>
  • 我不喜欢将管道读入变量d的技术,而只是将其回显到另一个管道-直通管道会更好-但是base64不知道仅使用输入的一行。
  • 由于某些原因,我还没有弄清楚,即使echo $d | base64 -d > img$((i++)).jpg正确地将编码数据写入了多个文件,也仅将写入计数器的位置(即echo $d > img$((i++)).b64)直接写入了第一个文件。我没有等着解决这个问题,而是将增量分成了自己的命令。

答案 1 :(得分:0)

您可以尝试使用Python抓取图像的编码字符串。 然后检出this以将编码的字符串转换为图像。

答案 2 :(得分:0)

  1. 使用正则表达式将base64映像定向到单独的文件
  2. 写入循环以遍历文件。
  3. 对文件进行解码的Bash命令如下: cat base64_file1 | base64 -d> file1.jpg