我想在控制台输出一个二维码?
I want to output a two - dimensional code on the console?
嗯,我已经从其他代码生成了二维码,直接获取二维码的大小,如果有颜色就循环输出一个色块,如果没有颜色,则为 space。但是效果是行高影响我生成二维码,导致二维码过高,请问有没有更好的解决办法,或者有没有可以直接使用的扩展包?
我尝试用\u2584替换字符,但是控制台显示了很多\u2584,效果不是很好。
字符无法正确转义,我确定我使用的是双引号
我用两个字符和两个space组成一个正方形,但这不是一个好的解决方案。
使用上下半高,全块,一个space在一行文字中编码两行二维码
例如,基于bacon/bacon-qr-code
<?php
require(__DIR__.'/vendor/autoload.php');
use BaconQrCode\Encoder\QrCode;
class HalfText extends \BaconQrCode\Renderer\Text\Plain {
protected $fullBlock = "\xE2\x96\x88";
protected $emptyBlock = "\x20";
protected $halfUpBlock = "\xE2\x96\x80";
protected $halfDnBlock = "\xE2\x96\x84";
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 BaconQrCode\Exception\OutOfBoundsException();
}
}
$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 \BaconQrCode\Writer;
if( $argc !== 2 ) {
exit(1);
}
$r = new HalfText();
$w = new Writer($r);
echo $w->writeString($argv[1]);
示例输出:
█▀▀▀▀▀█ █▄▄█ █▀▀▀▀▀█
█ ███ █ █ █ ███ █
█ ▀▀▀ █ █▄ █ █ ▀▀▀ █
▀▀▀▀▀▀▀ █ ▀ █ ▀▀▀▀▀▀▀
▀▀█ ▄█▀ ███ ▄█▀▀█▄ ██
▀▄█▀█▀▀ ▄█▀▄ ▄██▀ ▀
▀▀ ▀ ▀ ▄█▀ ██▄ ▄▄ ▀▄
█▀▀▀▀▀█ ▄▀ ▀▄ ███▀▄▀
█ ███ █ ▀▀ ▄█▄ ▄ █▀
█ ▀▀▀ █ █▀▄▄█▄ ▀█▀▀▀▀
▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀
糟糕,有人已经为此做了更好的 PR,哦,好吧。
嗯,我已经从其他代码生成了二维码,直接获取二维码的大小,如果有颜色就循环输出一个色块,如果没有颜色,则为 space。但是效果是行高影响我生成二维码,导致二维码过高,请问有没有更好的解决办法,或者有没有可以直接使用的扩展包?
我尝试用\u2584替换字符,但是控制台显示了很多\u2584,效果不是很好。
字符无法正确转义,我确定我使用的是双引号
我用两个字符和两个space组成一个正方形,但这不是一个好的解决方案。
使用上下半高,全块,一个space在一行文字中编码两行二维码
例如,基于bacon/bacon-qr-code
<?php
require(__DIR__.'/vendor/autoload.php');
use BaconQrCode\Encoder\QrCode;
class HalfText extends \BaconQrCode\Renderer\Text\Plain {
protected $fullBlock = "\xE2\x96\x88";
protected $emptyBlock = "\x20";
protected $halfUpBlock = "\xE2\x96\x80";
protected $halfDnBlock = "\xE2\x96\x84";
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 BaconQrCode\Exception\OutOfBoundsException();
}
}
$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 \BaconQrCode\Writer;
if( $argc !== 2 ) {
exit(1);
}
$r = new HalfText();
$w = new Writer($r);
echo $w->writeString($argv[1]);
示例输出:
█▀▀▀▀▀█ █▄▄█ █▀▀▀▀▀█
█ ███ █ █ █ ███ █
█ ▀▀▀ █ █▄ █ █ ▀▀▀ █
▀▀▀▀▀▀▀ █ ▀ █ ▀▀▀▀▀▀▀
▀▀█ ▄█▀ ███ ▄█▀▀█▄ ██
▀▄█▀█▀▀ ▄█▀▄ ▄██▀ ▀
▀▀ ▀ ▀ ▄█▀ ██▄ ▄▄ ▀▄
█▀▀▀▀▀█ ▄▀ ▀▄ ███▀▄▀
█ ███ █ ▀▀ ▄█▄ ▄ █▀
█ ▀▀▀ █ █▀▄▄█▄ ▀█▀▀▀▀
▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀
糟糕,有人已经为此做了更好的 PR,哦,好吧。