二维码的生成算法

时间:2024-04-17 12:47:36

最近不管是软件网站,购物网站等都特别盛行二维码,可能都是通过对

开源的二维码规范去生成对应的矩阵式二维码,这里想请教大家其中识

别和生成的规则是怎么设计的,希望大家给解析下...

 

 

QRcode是二维码的一种。QRcode可以存储最多4296个字母数字类型

的任意文本。这些文本可以是任何内容,例如,网址、联系信息、电话

号码。 QR code存储的信息可以被安装有适当软件的光学设备读取。

这种设备既可以是专用的QR code读取器也可以是手机。
通过调用 Google Chart Tools / Image Charts 的 API ,可以很方

便的生成QRcode。
调用方式也很简单,只要向 http://chart.apis.google.com/chart

传入适合的参数就可以了,参数如下:
1. cht=qr
这个是必需的,告诉 API ,你需要生成的是二维码。
2. chs=<width>x<height>
这个同样是必需的,告诉 API ,你需要生成的二维码的尺寸。
3. chl=<data>
这个还是必需的,用来告诉 API 二维码所包含的信息。可以是数字、

字符数字、字符、二进制信息、汉字。不能混合数据类型。数据必须

经过UTF-8 URL-encoded。如果需要传递的信息超过2K个字节,

请使用POST方式。
4. choe=<output_encoding>
终于来了个不是必须的,这个是用来声明生成的二维码所包含信息

的编码,默认是 UTF-8 ;其他可选编码是 Shift_JIS 、 ISO-8859-1
5. chld=<error_correction_level>|<margin>
可 选 纠错等级。QR码支持四个等级的纠错,用来恢复丢失的、读

错的、模糊的、数据。下面是可选的值:L-(默认)可以识别已损失

7%的数据;M-可以识别已损 失15%的数据;Q-可以识别已损失

25%的数据;H-可以识别已损失30%的数据。margin 是指生成的

二维码离图片边框的距离。
QR码是方形的,有相同的长和宽。QR码的大小是固定的:从21到

177的长/宽,每次递增4个像素点。每个配置被称为一个等级。长

和宽越大,存储的信息就越多。下面是版本摘要:
等级为1的QR码长和宽分别为21个像素,最多可以存储25个字母数字和字符。
等级为2的QR码长和宽分别为25个像素,最多可以存储47个字母数字和字符。
…以此类推 。
Chart API会根据你将存储的信息的大小来决定使用哪个等级的QR码。

最棒的QR码阅读器可以读取等级为40的QR码中存储的信息。然而通常

来说移动设备最多可以读取等级为4的QR码中存储的信息。
下面来介绍使用PHP调取Google Chart API 来生成二维码

<?php
class qrcode
{
private $data;

//creating text qr code
public function text($text){
$this->data = $text;
}

//creating code with link mtadata
public function link($url){
if (preg_match(\'/^http:\/\//\', $url) || preg_match(\'/^https:\/\//\', $url)) 
{
$this->data = $url;
}
else
{
$this->data = "<a href="http://".$url">http://".$url</a>;
}
}

//creating code with bookmark metadata
public function bookmark($title, $url){
$this->data = "MEBKM:TITLE:".$title.";URL:".$url.";;";
}

//creating code with email address metadata
public function email_address($email){
$this->data = "<a href="mailto:".$email">MAILTO:".$email</a>;
}

//creating code with email metadata
public function email($email, $subject, $message){
$this->data = "MATMSG:TO:".$email.";SUB:".$subject.";BODY:".$message.";;";
}

//creating code with phone 
public function phone_number($phone){
$this->data = "TEL:".$phone;
}

//creating code with sms metadata
public function sms($phone, $text){
$this->data = "SMSTO:".$phone.":".$text;
}

//creating code with mms metadata
public function mms($phone, $text){
$this->data = "MMSTO:".$phone.":".$text;
}

//creating code with mecard metadata
public function contact_info($name, $address, $phone, $email){
$this->data = "MECARD:N:".$name.";ADR:".$address.";TEL:".$phone.";EMAIL:".$email.";;";
}

//creating code with geo location metadata
public function geo($lat, $lon, $height){
$this->data = "GEO:".$lat.",".$lon.",".$height;
}

//creating code with wifi configuration metadata
public function wifi($type, $ssid, $pass){
$this->data = "WIFI:T:".$type.";S".$ssid.";".$pass.";;";
}

//creating code with i-appli activating meta data
public function iappli($adf, $cmd, $param){
$cur = current($param);
$next = next($param);
$param_str = "";
foreach($cur as $key => $val)
{
$param_str .= "PARAM:".$val.",".$next[$key].";";
}
$this->data = "LAPL:ADFURL:".$adf.";CMD:".$cmd.";".$param_str.";";
}

//creating code with gif or jpg image, or smf, MFi or ToruCa files as content
public function content($type, $size, $content){
$this->data = "CNTS:TYPE:".$type.";LNG:".$size.";BODY:".$content.";;";
}

//getting image
public function get_image($size = 150, $EC_level = \'L\', $margin = \'0\'){
$ch = curl_init();
$this->data = urlencode($this->data); 
curl_setopt($ch, CURLOPT_URL, \'http://chart.apis.google.com/chart\');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, \'chs=\'.$size.\'x\'.$size.\'&cht=qr&chld=\'.$EC_level.\'|\'.$margin.\'&chl=\'.$this->data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

$response = curl_exec($ch);
curl_close($ch);
return $response;
}

//getting link for image
public function get_link($size = 150, $EC_level = \'L\', $margin = \'0\'){
$this->data = urlencode($this->data); 
return \'http://chart.apis.google.com/chart?chs=\'.$size.\'x\'.$size.\'&cht=qr&chld=\'.$EC_level.\'|\'.$margin.\'&chl=\'.$this->data;
}

//forsing image download
public function download_image($file){

header(\'Content-Description: File Transfer\');
header(\'Content-Type: image/png\');
header(\'Content-Disposition: attachment; filename=QRcode.png\');
header(\'Content-Transfer-Encoding: binary\');
header(\'Expires: 0\');
header(\'Cache-Control: must-revalidate, post-check=0, pre-check=0\');
header(\'Pragma: public\');
header(\'Content-Length: \' . filesize($file));
ob_clean();
flush();
echo $file;
}
}
?>
使用上述二维码PHP类的方法:
<?php
include("qrcode.php");
$qr = new qrcode();
//bookmark
$title = "标点符";
$url = "http://www.biaodianfu.com/";
$qr->bookmark($title,$url);

//获取二维码图片URL
echo "<img src=\'".$qr->get_link()."\'>";

//here is the way to output image
//header("Content-type:image/png");
//echo $qr->get_image();

//and here is the way to force image download
//$file = $qr->get_image();
//$qr->download_image($file)

?>

 

 

二维码是用某种特定的几何图形按一定规律在平面(二维方向上) 分布的

黑白相间的图形记录数据符号信息的。常用的有Data Matrix, Maxi Code,

Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等。
生成的规则就是一个编码算法,识别自然就是一个解码算法了。采用不同的

二维码,你所说的规则自然不同。

QR码可以参看开源工程:
zxing
libqrencode

 

 

生成一个未验证的uuid,丢进数据库,然后编码一个uuid。
微信客户端扫买哦这个二维码,得到uuid,连同手机的信息发至服务器,

验证这个uuid。服务器标记这个uuid已验证。
本地会每隔一段时间向微信服务器的:
https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=

xxxxxxxxxxxxxx&tip=1&_=xxxxxxxxxx
这个地址发送一次请求,询问uuid是否通过验证。完成登录。