上图中的二维码,看起来跟普通的黑白二维码不一样,怎样生成?本文简单介绍这类“视觉二维码”的生成算法,供大家聊流。
前置阅读资料:
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’输出白色正方形,正方形的位置由二维数组对应的下标确定,于是可以得出如下的常规二维码图片:
$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,预览效果如下:
目前为止实现了改变二维码方块颜色和设置二维码背景图片,这只是第一步,让我们继续下一章节。
(未完待续...)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。