/ QrCode

如何在linux的终端输出二维码

脑子突然间蹦出来的想法,就迫不及待试试看能否实现。

需求很简单,就是在linux的终端中输入一个字符串(可以是以命令行参数形式,也可以是通过交互式输入),然后就会输出对应的二维码。

首先PHP已经有现成的QrCode类库phpqrcode,可以将一个字符串转成PNG格式的图片,但是PNG图片是没法在终端里展示的,于是仔细翻看文档和demo,发现该类库也可以输出0和1组成的矩阵(实际上该方法返回的是一个PHP的二维数组)。

已经有了0和1的矩阵,接下来要做的就是输出黑白色块,为了操作方便,我引入了symfony项目中的console组件。通过console组件可以非常方便的创建一个Cli命令,而且内置了大量输入和输出方法。

根据console的文档,我们可以新建两个OutputFormatStyle:

$black = new OutputFormatterStyle('black', 'black'); $output->getFormatter()->setStyle('blackc', $black); $white = new OutputFormatterStyle('white', 'white'); $output->getFormatter()->setStyle('whitec', $white);

定义了文字颜色和背景颜色分别是白色和黑色的两个样式。

这样就可以输出白色和黑色的色块了:

$output->writeln(' ');

上面的代码就会输出两个白色块中间隔着一个黑色块。

黑白色块输出搞定之后,只需要根据二维码的0-1矩阵输出对应色块就行。

所以核心代码如下:

protected function execute(InputInterface $input, OutputInterface $output) { $lrPadding = 1; $udPadding = 1; $text = 'http://leo108.com'; $map = array( 0 => ' ', 1 => ' ', ); $this->initStyle($output); $text = QRcode::text($text); $length = strlen($text[0]); $paddingLine = str_repeat($map[0], $length + $lrPadding * 2) . "\n"; $after = $before = str_repeat($paddingLine, $udPadding); $output->write($before); foreach ($text as $line) { $output->write(str_repeat($map[0], $lrPadding)); for ($i = 0; $i < $length; $i++) { $type = substr($line, $i, 1); $output->write($map[$type]); } $output->writeln(str_repeat($map[0], $lrPadding)); } $output->write($after); }

其中$lrPadding和$udPadding分别用来配置左右和上下白边的长度。

最终代码已托管github

最后来张效果图:

如何在linux的终端输出二维码