您的位置:首页 > 编程语言 > Go语言

生成QR Code 二维条形码 ----- Google Chart API

2012-03-19 00:46 411 查看
本文详细 介绍 QR Code 二维码的应用

第一部分 通过网络, 前端产生QR Code 二维条形码

产生 QR Code 图像需要传递的参数如下:

名 称 带入参数值
cht告诉Google Chart 要呈现什么类型的图片文件,由于此范例是要呈现出QR Code,因此该参数填入qr
chsQR Code 图片文件的维度,如本示例使用 120 X120
ch1欲编码的文字内容
choe编码方式,国内OMIA 联盟仅支持 UTF-8
示例代码 getGooelQRChart() 方法即是组成要显示的远程图像网址, 再以 <img src=""> 方式来组成 HTML TAG,成像的关键是利用 WebView 来显示 Html 里的内容

主要代码:

/* 调用Google API,产生QR Code二维条形码 */

public String genGoogleQRChart(String strToQRCode, int strWidth) {

String strReturn = "";

try {

strReturn = new String(strToQRCode.getBytes("utf-8"));

/* 组成Google API需要的传输参数字符串 */

strReturn = "<html><body>"

+ "<img src=http://chart.apis.google.com/chart?chs=" + strWidth + "x"

+ strWidth + "&chl=" + URLEncoder.encode(strReturn, "utf-8")

+ "&choe=UTF-8&cht=qr></body></html>";

} catch (Exception e) {

e.printStackTrace();

}

return strReturn;

}

其中strToQRCode 可输入字符,如 "中国"

示意图如下:



注意有一个小技巧:

QR Code 二维条形码对汉字的编码是采用UTF-8, 程序中编写了一个自定义方法 big52unicode() 来转换,如果手机的编码为BIG5,

可以通过此方法来转换为UTF-8

/* 自定义BIG5转UTF-8 */

public String big52unicode(String strBIG5) {

String strReturn = "";

try {

strReturn = new String(strBIG5.getBytes("big5"), "UTF-8");

} catch (Exception e) {

e.printStackTrace();

}

return strReturn;

}

/* 自定义UTF-8转BIG5 */

public String unicode2big5(String strUTF8) {

String strReturn = "";

try {

strReturn = new String(strUTF8.getBytes("UTF-8"), "big5");

} catch (Exception e) {

e.printStackTrace();

}

return strReturn;

}

除了条形码,以下接着介绍一个Pie饼状图

名 称参数值
chtPie Chart 有很多类型,3D Pie参数为p3
chs设置图片维度大小: 250X100
chl设置两个分类名称为: L,K
chd设置各个分类的比例
示意图如下:



具体用法请参见
EX09_03 工程

第二部分 断网情况下,手机本地生成 QR Code 二维条形码

要本地生成二维码,首先需要下载第三方jar 包, 首先打开 http://www.swetake.com/index-e.php 网站, 下载所提供的Java Library ,

这里使用 ver. 0.50 beta,导入SwetakeQRCode.jar,

程序流程是: 用户输入字符串,利用SwetakeQRCode.jar 包转成产生图片文件二维数组,作为产生条形码依据,在SurfaceView 上绘制二维条形码矩形图片。

主要代码如下:

/* 自定义产生QR Code的函数 */

public void AndroidQREncode(String strEncoding, int qrcodeVersion) {

try {

/* 建构QRCode编码对象 */

com.swetake.util.Qrcode testQrcode = new com.swetake.util.Qrcode();

/* L','M','Q','H' */

testQrcode.setQrcodeErrorCorrect('M');

/* "N","A" or other */

testQrcode.setQrcodeEncodeMode('B');

/* 0-20 */

testQrcode.setQrcodeVersion(qrcodeVersion);

// getBytes

byte[] bytesEncoding = strEncoding.getBytes("utf-8");



if (bytesEncoding.length>0 && bytesEncoding.length <120) {

/* 将字符串通过calQrcode函数转换成boolean数组 */

boolean[][] bEncoding = testQrcode.calQrcode(bytesEncoding);

/* 依据编码后的boolean数组,绘图 */

drawQRCode (bEncoding, getResources().getColor(R.drawable.black));

}

} catch (Exception e) {

e.printStackTrace();

}

}

其中程序默认的 QR Code Version 为4,经测试仅能接受62个字符,紧接着 调用drawQRCode() 方法接受来自编码后的 boolean 二维数组,将在SurfaceView 上绘制出QR Code 二维条形码

/* 在SurfaceView上绘制QR Code条形码 */

private void drawQRCode(boolean[][] bRect, int colorFill)

{

/* test Canvas*/

int intPadding = 20;

/* 欲在SurfaceView上绘图,需先lock锁定SurfaceHolder */

Canvas mCanvas01 = mSurfaceHolder01.lockCanvas();

/* 设置画布绘制颜色 */

mCanvas01.drawColor(getResources().getColor(R.drawable.white));

Paint mPaint01 = new Paint(); /* 创建画笔 */

mPaint01.setStyle(Paint.Style.FILL); /* 设置画笔颜色及模式 */

mPaint01.setColor(colorFill);

mPaint01.setStrokeWidth(1.0F);



/* 逐一加载2维boolean数组 */

for (int i=0;i<bRect.length;i++) {

for (int j=0;j<bRect.length;j++) {

if (bRect[j][i])

{

/* 依据数组值,绘出条形码方块

这里5个参数分别为 起点的x,y坐标,矩形的宽,高,方形外框的颜色 */

mCanvas01.drawRect(new Rect(intPadding+j*3+2, intPadding+i*3+2,

intPadding+j*3+2+3, intPadding+i*3+2+3), mPaint01);

}

}

}

/* 解锁SurfaceHolder,并绘图 */

mSurfaceHolder01.unlockCanvasAndPost(mCanvas01);

}

这里由于一次性绘图,不需要设置 mSurfaceHolder01.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);机制来持续更新SurfaceView

示意图如下:



具体代码请参见 EX10_04 工程

第三部分 手机拍照二维条形码,实现解码

本实例由于应用到拍照,必须在真机上才能实现功能.

前面两示例是先输入字符,获取二维码; 本示例相反,通过拍照扫描二维码,解码内容.

要对二维码进行解码,需引入第三方 jar 包

首先打开 http://sourceforge.jp/projects/qrcode/, 下载jar包,并将文件名修改为sourceForgeQRCode.jar,导入到项目中.

实现解码流程包括:

1. 打开相机, 运行预览 (Preview)

2. 设计瞄准框,让用户对准二维条形码

3. 拍照,取得静态图片

4. 将图片传递到 SourceForgeQRCode 的方法运行解码



具体代码请参见
EX10_05 工程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: