Contents

如何在Linux中对图像进行Base64编码

1. 概述

在这篇简短的文章中,我们将了解如何将图像转换为Base64。为此,我们将使用大多数 Linux 发行版上可用的base64工具。

2. 将图像转换为 Base64

有时,我们可能需要对二进制数据进行编码以通过仅处理文本数据的介质进行传输。在 Linux 上,我们可以访问base64 实用程序,它可以对文件进行编码和解码,并将其显示在标准输出上。它非常小且易于使用。

base64软件包随GNU Coreutils 一起提供,它安装在大多数 Linux 发行版上。我们可以简单地通过发出命令在终端中验证它:

$ base64 --version
base64 (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.

2.1. 使用base64实用程序

base64的语法很简单。我们运行命令base64后跟选项和一个文件:

$ base64 [OPTIONS]... [FILE]

让我们将图像转换为 Base64 并将结果显示到标准输出:

$ base64 ~/Pictures/book.jpg
/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxAQEhUQEA8VFRUQEBUPFRUVFQ8VFRUVFRUWFhUV
FRUYHSggGBolHRUVITEhJSkrLi4uFx8zODMtNygtLisBCgoKDg0OFxAQGCsiHyUtLS0rLy0rLSst
LS0tLS0rLS0rLSsrLTUrLS0tLS0wLSstLSstLS0rLSstLSstKystK//AABEIAMIBAwMBIgACEQED
EQH/xAAcAAEAAgMBAQEAAAAAAAAAAAAAAQIDBAUHBgj/xABHEAACAQICBQcICAQFAwUAAAAAAQID
...

我们可以看到它将编码数据打印到标准输出。当然,输出会更长,具体取决于文件大小。为清楚起见,省略了其余行。

此外,还有一个选项*–wrap-w可以用来限制输出列。例如,如果我们需要将一行的宽度限制为 56,我们可以将它传递给–wrap*选项:

$ base64 --wrap 56 ~/Pictures/book.jpg
/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxAQEhUQEA8VFRUQEBUP
FRUVFQ8VFRUVFRUWFhUVFRUYHSggGBolHRUVITEhJSkrLi4uFx8zODMt
...

另一方面,将0作为参数传递将产生一个长的单行 Base64 字符串。

2.2. 为 HTML 编码图像

我们可以编写一个 shell 脚本来创建一个img元素并将 Base64 数据嵌入其中。它应该自动检测图像格式并将其用作 MIME 类型。我们将为它提供图像文件,它应该将img元素打印到标准输出:

#!/bin/bash
usage() {
  echo "Usage: ./base64img [FILE]"
  echo "Formats: APNG BMP GIF JPEG PNG WEBP"
}
# Print usage and exit if the file was not provided
[ $# -eq 0 ] && usage && exit 1
# Grab the image format
fmt=$(file "$1" | grep -iEo 'apng|bmp|gif|jpeg|png|webp' | head -n1 | tr '[:upper:]' '[:lower:]')
# Check if the image format is supported
[ -z "$fmt" ] && usage && exit 1
# Create an IMG template
img="<img src='data:image/"$fmt";base64, $(base64 -w 0 "$1")' />"
echo "$img"

首先,我们编写使用函数以防出错。然后,我们使用file 命令获取图像格式并将其转换为小写。之后,我们检查它是否为空变量,因为如果格式不支持,该变量将为空。最后,我们创建一个模板并将其打印到标准输出。

让我们测试一下:

$ ./base64img.sh ~/Pictures/block.png
<img src='data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAAmkwkpAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSotULNhBxCFDddGCqIijVqEIFUKt0KqDyaV/0KQhaXFxFFwLDv4sVh1cnHV1cBUEwR8QNzcnRRcp8buk0CLGO457eO97X+6+A4RGmWlW1zig6VUzlYiLmeyqGHhFEGGaowjLzDLmJCkJz/F1Dx/f72I8y7vuz9Gr5iwG+ETiWWaYVeIN4unNqsF5nzjCirJKfE48ZtIFiR+5rrj8xrngsMAzI2Y6NU8cIRYLHax0MCuaGvEUcVTVdMoXMi6rnLc4a+Uaa92TvzCU01eWuU5rCAksYgkSRCiooYQyqojRrpNiIUXncQ//oOOXyKWQqwRGjgVUoEF2/OB/8Lu3Vn5ywk0KxYHuF9v+GAYCu0Czbtvfx7bdPAH8z8CV3vZXGsDMJ+n1thY9Avq2gYvrtqbsAZc7wMCTIZuyI/lpCfk88H5G35QF+m+BnjW3b61znD4AaepV8gY4OARGCpS97vHuYGff/q1p9e8HZDNyobFmBakAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAUSURBVAjXY3SufccAA0wMSAA3BwBUVQG2LRn5IQAAAABJRU5ErkJggg==' />

2.3. 将 Base64 内容复制到剪贴板

有时,从终端窗口准确复制文本可能很困难。因此,我们可以将输出保存到文本文件,也可以将其复制到系统剪贴板。幸运的是,在 Linux 上,我们可以使用一个名为xclip 的工具,通过它我们可以访问系统剪贴板

xclip包没有安装在某些 Linux 发行版上,但我们可以使用 yum 或 apt 从官方存储库安装它。安装后,我们可以使用它,如以下代码段所示:

$ xclip -selection clipboard file.txt

让我们分解上面的命令:

  • -selection选项指定复制内容的位置
  • 剪贴板参数指定我们要将内容复制到系统剪贴板
  • 最后一个参数是我们要从中复制的文件

在我们的例子中,我们想要从标准输出中复制 Base64 内容。因此,我们将base64输出通过管道传输xclip

$ base64 ~Pictures/block.png | xclip -selection clipboard

这将有效地将 Base64 数据复制到剪贴板,准备粘贴。