视觉二维码demo

上图中的二维码,看起来跟普通的黑白二维码不一样,怎样生成?本文简单介绍这类“视觉二维码”的生成算法,供大家聊流。

前置阅读资料:
1.什么是二维码 -->http://baike.baidu.com/view/132241.htm
2.二维码生成的php开源库(稍后给出)
3.demo地址-->http://visual.2weima.com/

OK,下面进入正文:

字符串转换成[1,1,1,1,0,0.....0,1]阵列的过程本文不讨论,由已经开源多年的QR库负责转换。

我们需要在PHP程序(或其他程序语言中)调用QR库,并封装如下的function:

getFrame($str){
    ......
    return Array(
        {1,1,1,1,1,1,1,0,1,0,......,1,0},
        {1,1,1,1,1,1,1,0,1,0,......,1,0},
        {0,1,0,1,1,1,1,0,1,0,......,1,0},
        ......
        ......
        {1,1,1,1,1,1,1,0,1,0,......,1,1}
    )
}

那么,转换之后的二维码原始数据,就是这样一个二维数组对象。调用PHP的GD库(或其他语言对应的图形库),根据上述二维数组做循环输出正方形图形的操作,‘1’输出黑色正方形,‘0’输出白色正方形,正方形的位置由二维数组对应的下标确定,于是可以得出如下的常规二维码图片:
常规二维码demo

    $frame = getFrame("hello world");
    $h = count($frame);
    $w = strlen($frame[0]);
    $pixelPerPoint = 15; //每个色块15像素
    $imgW = $w * $pixelPerPoint;    //图片宽度
    $imgH = $h * $pixelPerPoint;    //图片高度
    $base_image = imagecreate($imgW, $imgH);
    $bgc = imagecolorallocate($base_image,255,255,255);    //背景色白色
    ///////////////////////////////////////////////////////////
    $col = imagecolorallocate($base_image,0,0,0);//前景色

    for($y=0; $y<$h; $y++) {
        for($x=0; $x<$w; $x++) {
            if ($frame[$y][$x] == '1'){
                imagefilledrectangle($base_image,($x)* $pixelPerPoint,($y) * $pixelPerPoint,($x + 1 )* $pixelPerPoint,($y+ 1) * $pixelPerPoint,$col); 
            }
        }
    }

这里用开源库和简单的方法,能在自己的服务器端生成普通的黑白方块二维码了,接下来尝试改变二维码的颜色:

    $col = imagecolorallocate($base_image,255,0,0);//前景色设置成红色

简单的将前景色设置成(255,0,0),红色二维码就成功生成了

请输入图片描述

接下来再尝试改变一下方块颜色,让颜色与方块的坐标关联起来,注意RGB颜色的范围是0-255,不要超过这个范围:

    for($y=0; $y<$h; $y++) {
        for($x=0; $x<$w; $x++) {
            if ($frame[$y][$x] == '1'){
                $col = imagecolorallocate($base_image,100 + $y * 4,50 + $x * 3,30);//颜色与坐标关联
                imagefilledrectangle($base_image,($x)* $pixelPerPoint + $this->l,($y) * $pixelPerPoint + $this->t,($x + 1 )* $pixelPerPoint + $this->l,($y+ 1) * $pixelPerPoint + $this->t,$col); 
            }
        }
    }

请输入图片描述
这样就实现了一个颜色渐变的彩色二维码,是不是开始变得有意思了?

让我们继续:给二维码加一个背景图片

$base_image = imagecreatefrompng("bg.png");

将$base_image对象用GD库的imagecreatefrompng方法来创建,非常easy,预览效果如下:
请输入图片描述
目前为止实现了改变二维码方块颜色和设置二维码背景图片,这只是第一步,让我们继续下一章节。

(未完待续...)


余悠
20 声望3 粉丝

中国地质大学宝石学博士,珠宝鉴定师。北京迅鸥在线科技有限公司CTO


下一篇 »
Nodejs学习随笔