首先PHP已经有现成的QrCode类库phpqrcode,可以将一个字符串转成PNG格式的图片,但是PNG图片是没法在终端里展示的,于是仔细翻看文档和demo,发现该类库也可以输出0和1组成的矩阵(实际上该方法返回的是一个PHP的二维数组)。
已经有了0和1的矩阵,接下来要做的就是输出黑白色块,为了 *** 作方便,我引入了symfony项目中的console组件。通过console组件可以非常方便的创建一个Cli命令,而且内置了大量输入和输出方法。
根据console的文档,我们可以新建两个OutputFormatStyle:
1$black = new OutputFormatterStyle('black', 'black')
2$output->getFormatter()->setStyle('blackc', $black)
3$white = new OutputFormatterStyle('white', 'white')
4$output->getFormatter()->setStyle('whitec', $white)
定义了文字颜色和背景颜色分别是白色和黑色的两个样式。
这样就可以输出白色和黑色的色块了:
1$output->writeln('<whitec> </whitec><blackc> </blackc><whitec> </whitec>')
上面的代码就会输出两个白色块中间隔着一个黑色块。
黑白色块输出搞定之后,只需要根据二维码的0-1矩阵输出对应色块就行。
所以核心代码如下:
01protected function execute(InputInterface $input, OutputInterface $output)
02{
03$lrPadding = 1
04$udPadding = 1
05$text = 'http://leo108.com'
06$map = array(
070 =>'<whitec> </whitec>',
081 =>'<blackc> </blackc>',
09)
10$this->initStyle($output)
11$text = QRcode::text($text)
12$length = strlen($text[0])
13
14$paddingLine = str_repeat($map[0], $length + $lrPadding * 2) . "\n"
15$after = $before = str_repeat($paddingLine, $udPadding)
16$output->write($before)
17foreach ($text as $line) {
18$output->write(str_repeat($map[0], $lrPadding))
19for ($i = 0$i <$length$i++) {
20$type = substr($line, $i, 1)
21$output->write($map[$type])
22}
23$output->writeln(str_repeat($map[0], $lrPadding))
24}
25$output->write($after)
26}
其中$lrPadding和$udPadding分别用来配置左右和上下白边的长度。
最终代码已托管github
你这是要识别桌面上的二维码还是通过摄像头识别二维码如果是桌面上的
linux C语言去做这个识别二维码,这个貌似难度有太大。而且很难找到资料的。
有时候要知道变通,你为什么不用java的jar库去做识别呢,而且很多的现成资料可以查看,
如果你非得用C去做,那么建议你查询一下libqrencode 这个用C写的库
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)