我想在控制台上输出二维码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我想在控制台上输出二维码?相关的知识,希望对你有一定的参考价值。

好吧,我已经从其他代码生成了一个QR码,我将直接得到QR码的大小,如果有颜色,我会通过循环输出一个颜色块,如果有颜色,我会通过循环输出颜色块没有颜色。但效果是线高会影响我的QR码生成,导致QR码太高,有更好的解决方案,还是有可以直接使用的扩展包? enter image description here enter image description here

我尝试用 u2584替换字符,但控制台显示了很多 u2584,不是一个好结果。

字符无法正确转义,我敢肯定我使用的是双引号enter image description here

我使用两个字符和两个空格来形成一个正方形,但这不是一个好的解决方案.enter image description here enter image description here

答案

使用半高的上部和下部,完整的块和一个空格来在一行文本中编码两行QR码。

例如,基于bacon/bacon-qr-code

<?php
require(__DIR__.'/vendor/autoload.php');
use BaconQrCodeEncoderQrCode;

class HalfText extends BaconQrCodeRendererTextPlain {
    protected $fullBlock    = "xE2x96x88";
    protected $emptyBlock   = "x20";
    protected $halfUpBlock  = "xE2x96x80";
    protected $halfDnBlock  = "xE2x96x84";

    public function render(QrCode $qrCode) {
        $result = '';
        $matrix = $qrCode->getMatrix();
        $width  = $matrix->getWidth();

        // Top margin
        for ($x = 0; $x < $this->margin; $x++) {
            $result .= str_repeat($this->emptyBlock, $width + 2 * $this->margin) . PHP_EOL;
        }

        // Body
        $array = $matrix->getArray();

        for( $y=0, $height=count($array); $y<$height; $y+=2 ) {
            $result .= str_repeat($this->emptyBlock, $this->margin); // left margin
            $oddBottom = ! key_exists($y+1, $array);
            for( $x=0, $width=count($array[$y]); $x<$width; $x++ ) {
                $top = $array[$y][$x];
                $bottom = $oddBottom ? 0 : $array[$y+1][$x];
                switch( ($top << 1) | $bottom ) {
                    case 0:
                        $result .= $this->emptyBlock;
                        break;
                    case 1:
                        $result .= $this->halfDnBlock;
                        break;
                    case 2:
                        $result .= $this->halfUpBlock;
                        break;
                    case 3:
                        $result .= $this->fullBlock;
                        break;
                    default:
                        throw new BaconQrCodeExceptionOutOfBoundsException();
                }
            }
            $result .= str_repeat($this->emptyBlock, $this->margin); // right margin
            $result .= PHP_EOL;
        }

        // Bottom margin
        for ($x = 0; $x < $this->margin; $x++) {
            $result .= str_repeat($this->emptyBlock, $width + 2 * $this->margin) . PHP_EOL;
        }

        return $result;
    }
}

// testing
use BaconQrCodeWriter;

if( $argc !== 2 ) {
    exit(1);
}

$r = new HalfText();
$w = new Writer($r);

echo $w->writeString($argv[1]);

示例输出:

 █▀▀▀▀▀█ █▄▄█  █▀▀▀▀▀█
 █ ███ █   █   █ ███ █
 █ ▀▀▀ █ █▄ █  █ ▀▀▀ █
 ▀▀▀▀▀▀▀ █ ▀ █ ▀▀▀▀▀▀▀
 ▀▀█ ▄█▀ ███ ▄█▀▀█▄ ██
  ▀▄█▀█▀▀  ▄█▀▄ ▄██▀ ▀
  ▀▀ ▀ ▀ ▄█▀ ██▄ ▄▄ ▀▄
 █▀▀▀▀▀█ ▄▀  ▀▄ ███▀▄▀
 █ ███ █  ▀▀ ▄█▄ ▄  █▀
 █ ▀▀▀ █ █▀▄▄█▄ ▀█▀▀▀▀
 ▀▀▀▀▀▀▀ ▀   ▀▀ ▀    ▀

Woops有人已经为此做了更好的公关哦,哦。

https://github.com/Bacon/BaconQrCode/pull/25

以上是关于我想在控制台上输出二维码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IDEA 控制台上显示 Play 框架“日志”

如何在控制台上的同一位置写入输出?

如何使用 ANSI Escape 代码在控制台上输出彩色文本

为什么此代码的输出未出现在控制台上?

控制台上的陷阱退出

Windows 控制台上的 UTF-8 输出