通过Google Chart API生成QR code

QR code ,Quick Response code,是一种流行的2维条形码,能够存储多达4296个字母数字字符的任意文本,对于汉字,做多存储1817个,相对于177x177这么小一块区域来说容量已经相当高,更重要的是读取速度——准确而高效,因而在各个领域都有非常广泛的应该。导致现在手机读取条码软件也是相当流行。

Google Chart API 里就有专门的 QR code 生成调用 ,能非常方便的获取自己想要的 QR code。配图的内容为 swordair.com,长宽为150px,由google生成,看起来还挺不错挺蛋疼的。 如果只是随便玩一下,网络上也有在线的QR code 生成工具,使用起来更加便捷。

问题在于,我们拿着这幅自己完全看不懂的图做什么?用来写情书吗?恐怕是个不错的主意,绕这么多圈子想不收卡都难了,哈哈。

难得闲来无事,对此API我就简单封装了一个QRcode.js,方便日常使用。好吧,我常常写情书,而且一写就停不下来:)

当然,卡也就没少收了...

/**
 * generate QR Code images using Google Chart API
 * developed by iifksp@swordair.com
 * http://www.swordair.com
 * api docs: http://code.google.com/apis/chart/image/docs/gallery/qr_codes.html
 */
var QRcode = function (config) {
	this.cfg = {
		container_id : '',
		/* The data to encode,  2K maximum length */
		data : '',
		/* Image size, QRcode is a square */
		size : 150,
		/* Error Correction Level
		L - [Default] Allows recovery of up to 7% data loss
		M - Allows recovery of up to 15% data loss
		Q - Allows recovery of up to 25% data loss
		H - Allows recovery of up to 30% data loss */
		ec_level : 'L',
		/* The width of the white border around the data portion of the chart.
		This is in rows, not in pixels. */
		margin : 4,
		/* How to encode the data in the chart */
		encode : 'UTF-8'
	}

	this.init(config);

	this.api_url = 'http://chart.apis.google.com/chart';
	this.param = {
		cht : 'qr',
		chs : this.cfg.size + 'x' + this.cfg.size,
		chl : encodeURIComponent(this.cfg.data),
		choe : this.cfg.encode,
		chld : this.cfg.ec_level + '|' + this.cfg.margin
	}

	this.qrcode_img_src = '';
	this.generateQRcode();
};

QRcode.prototype = {

	init : function (config) {
		for(var opt in config){
			this.cfg[opt] = config[opt];
		}
	},

	generateQRcode : function () {
		if(this.cfg.data == ''){
			return;
		}else{
			this.qrcode_img_src = this.api_url + '?' + this.joinParam();
		}
	},

	display : function (id) {
		var container_id = id ? id : this.cfg.container_id;
		if(container_id == '' ||
		!document.getElementById(container_id)){
			return;
		}else{
			var container = document.getElementById(container_id);
			var img = document.createElement('img');
			img.src = this.qrcode_img_src;
			container.appendChild(img);
		}
	},

	joinParam : function(){
		var quary = [];
		for(var opt in this.param){
			quary.push(opt + '=' + this.param[opt]);
		}
		return quary.join('&');
	}
};

使用上就是简单的实例化和显示,时间挺仓促,可能还有不完备的地方,以后再继续改进。

var qrcode = new QRcode({
	size : 150,
	data : 'swordair.com',
	container_id : 'container'
});
qrcode.display('other_container');