在前言中最后部分,提到了二维码开发工具资源ZXing。网上有它最新1.7版的源码,感兴趣的可以下载下来看看,要打包生成core比较麻烦,网上有相关教程。嫌麻烦的朋友,可以去我的资源里下载Java版的core.jar,地址前言最后已经给出。

今天开始介绍利用android生成普通二维码,以及仿新浪微博二维码。话说新浪微博也是采用了ZXing的技术,而腾讯微信,我推测它好像是通过服务器生成后下载下来的。因为每次生成二维码,如果没有网络的情况下就无法得到。
补一句:因为都是java开发语句,所以开发j2me和j2se的也可以参考,创建原理是一样的,只是在最后对生成图片的处理略有不同。

首先,在生成二维码前要设置一些配置参数,也就是要告诉系统你要生成什么样的二维码。关于二维码参数的介绍不是本篇重点,我会放在后面的文章中做系统介绍。

ZXing采用Hashtable方式来保存设置参数,比如我们这里设置的纠错能力为H级别,设置编码类型为UTF-8:

  1. // 用于设置QR二维码参数
  2. Hashtable<EncodeHintType, Object> qrParam = new Hashtable<EncodeHintType, Object>();
  3. // 设置QR二维码的纠错级别——这里选择最高H级别
  4. qrParam.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  5. // 设置编码方式
  6. qrParam.put(EncodeHintType.CHARACTER_SET, "UTF-8");

接下来,我们还要告诉系统二维码扫描后的内容,以及采用的编码形式,生成图片的大小:

  1. // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
  2. BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
  3. BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, qrParam);

最后,我们就会得到生成QR二维码数据。但这里只是得到一个由true和false组成的数组,然后你就可以根据此生成图片。下面给出的是android采用Bitmap方式生成的黑白图片:

  1. // 开始利用二维码数据创建Bitmap图片,分别设为黑白两色
  2. int w = bitMatrix.getWidth();
  3. int h = bitMatrix.getHeight();
  4. int[] data = new int[w * h];
  5. for (int y = 0; y < h; y++) {
  6. for (int x = 0; x < w; x++) {
  7. if (bitMatrix.get(x, y))
  8. data[y * w + x] = 0xff000000;// 黑色
  9. else
  10. data[y * w + x] = -1;// -1 相当于0xffffffff 白色
  11. }
  12. }
  13. // 创建一张bitmap图片,采用最高的图片效果ARGB_8888
  14. Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
  15. // 将上面的二维码颜色数组传入,生成图片颜色
  16. bitmap.setPixels(data, 0, w, 0, 0, w, h);

以下是Android版完整生成二维码的代码:

  1. /**
  2. * 创建QR二维码图片
  3. */
  4. private Bitmap createQRCodeBitmap() {
  5. // 用于设置QR二维码参数
  6. Hashtable<EncodeHintType, Object> qrParam = new Hashtable<EncodeHintType, Object>();
  7. // 设置QR二维码的纠错级别——这里选择最高H级别
  8. qrParam.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
  9. // 设置编码方式
  10. qrParam.put(EncodeHintType.CHARACTER_SET, "UTF-8");
  11. // 设定二维码里面的内容,这里我采用我微博的地址
  12. String content = "sinaweibo://userinfo?uid=2568190010";
  13. // 生成QR二维码数据——这里只是得到一个由true和false组成的数组
  14. // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数
  15. try {
  16. BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
  17. BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, qrParam);
  18. // 开始利用二维码数据创建Bitmap图片,分别设为黑白两色
  19. int w = bitMatrix.getWidth();
  20. int h = bitMatrix.getHeight();
  21. int[] data = new int[w * h];
  22. for (int y = 0; y < h; y++) {
  23. for (int x = 0; x < w; x++) {
  24. if (bitMatrix.get(x, y))
  25. data[y * w + x] = 0xff000000;// 黑色
  26. else
  27. data[y * w + x] = -1;// -1 相当于0xffffffff 白色
  28. }
  29. }
  30. // 创建一张bitmap图片,采用最高的效果显示
  31. Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
  32. // 将上面的二维码颜色数组传入,生成图片颜色
  33. bitmap.setPixels(data, 0, w, 0, 0, w, h);
  34. return bitmap;
  35. } catch (WriterException e) {
  36. e.printStackTrace();
  37. }
  38. return null;
  39. }

至此,你已经可以创建出二维码了。接下来,讲一下新浪微博二维码方式。

在前言中,已经对新浪微博二维码做了分析,它只是合理的利用了二维码的规则,在二维码基础上增加了一些装饰,也就是说,在生成好的二维码上,贴了张头像照。如果原理大家明白了的话,自己也就可以实现了。我这里附上在二维码图片基础上增加头像的方法:

  1. /**
  2. * 在二维码上绘制头像
  3. */
  4. private void createQRCodeBitmapWithPortrait(Bitmap qr, Bitmap portrait) {
  5. // 头像图片的大小
  6. int portrait_W = portrait.getWidth();
  7. int portrait_H = portrait.getHeight();
  8. // 设置头像要显示的位置,即居中显示
  9. int left = (QRCODE_SIZE - portrait_W) / 2;
  10. int top = (QRCODE_SIZE - portrait_H) / 2;
  11. int right = left + portrait_W;
  12. int bottom = top + portrait_H;
  13. Rect rect1 = new Rect(left, top, right, bottom);
  14. // 取得qr二维码图片上的画笔,即要在二维码图片上绘制我们的头像
  15. Canvas canvas = new Canvas(qr);
  16. // 设置我们要绘制的范围大小,也就是头像的大小范围
  17. Rect rect2 = new Rect(0, 0, portrait_W, portrait_H);
  18. // 开始绘制
  19. canvas.drawBitmap(portrait, rect2, rect1, null);
  20. }

这里有几点要注意:
1、如果要采用在二维码中添加头像,那么生成的二维码最好采用最高等级H级别的纠错能力,目的有两个:一是增加二维码的正确识别能力;二是扩大二维码数据内容的大小。
2、头像大小最好不要超过二维码本身大小的1/5,而且只能放在正中间部位。这是由于二维码本身结构造成的。所以说新浪微博的二维码只是合理的利用了规则而已。
3、如果要仿照腾讯微信,在二维码边上增加装饰框,记得一定要在装饰框和二维码之间留出白边,这是为了二维码可识别。

最后附上截图比对一下,截图上为正常二维码,下面为增加头像的二维码。与新浪微博生成二维码的对比一下,基本一样。

自己生成的二维码:

新浪微博二维码:

附上完整代码工程:仿新浪微博二维码

二维码之zxing仿新浪微博二维码的更多相关文章

  1. 【源码分享】仿网易客户端源码效果 apkbus的~

    http://www.apkbus.com/forum.php?mod=viewthread&tid=184867 内容我就不说了,直接点开看吧.

  2. 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(转)

    转载:http://blog.csdn.net/xiaanming/article/details/10163203 了解二维码这个东西还是从微信 中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从 ...

  3. C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)

    1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...

  4. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍   我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...

  5. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  6. 使用zxing生成解析二维码

    1. 前言 随着移动互联网的发展,我们经常在火车票.汽车票.快餐店.电影院.团购网站以及移动支付等各个场景下见到二维码的应用,可见二维码以经渗透到人们生活的各个方面.条码.二维码以及RFID被人们应用 ...

  7. 手把手教你生成二维码-google.zxing

    一.目标 输入网址,生成网址的二维码 二.概况 1.效果:UI丑,但功能实现了 2.项目目录 三.用到的第三方资源 1.google的扫码包zxing 2.JQuery 四.步骤(用myEclipse ...

  8. Java使用ZXing生成/解析二维码图片

    ZXing是一种开源的多格式1D/2D条形码图像处理库,在Java中的实现.重点是在手机上使用内置摄像头来扫描和解码设备上的条码,而不与服务器通信.然而,该项目也可以用于对桌面和服务器上的条形码进行编 ...

  9. 利用Spring Boot+zxing,生成二维码还能这么简单

    在网站开发中,经常会遇到要生成二维码的情况,比如要使用微信支付.网页登录等,本文分享一个Spring Boot生成二维码的例子,这里用到了google的zxing工具类. 本文目录 一.二维码简介二. ...

随机推荐

  1. appium的get_attribute方法

    转http://blog.csdn.net/bear_w/article/details/50330753 问题描述 当使用类似下面的代码获取元素的 content-desc 属性时,会报 NoSuc ...

  2. java笔记之线程简述1

    1:线程是依赖于进程而存在. 2:什么是进程?  通过任务管理器我们就看到了进程的存在.  而通过观察,我们发现只有运行的程序才会出现进程.  进程:就是正在运行的程序.  进程是系统进行资源分配和调 ...

  3. CodeForces 723C Polycarp at the Radio (题意题+暴力)

    题意:给定 n 个数,让把某一些变成 1-m之间的数,要改变最少,使得1-m中每个数中出现次数最少的尽量大. 析:这个题差不多读了一个小时吧,实在看不懂什么意思,其实并不难,直接暴力就好,n m不大. ...

  4. 【黑金教程笔记之004】【建模篇】【Lab 03 消抖模块之一】—笔记

    设计思路: (1)       一旦检测到按键资源按下(从高电平到低电平),“电平检测模块”就会拉高H2L_Sig电平,然后拉低. (2)       “10ms延迟模块”检测到H2L_Sig高电平, ...

  5. bzoj 3830: [Poi2014]Freight【dp】

    参考:https://blog.csdn.net/zqh_wz/article/details/52953516 妙啊 看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走 ...

  6. bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】

    明明是个最短路却有网络流一样的神建图= A = 首先要是暴力建图的话最坏有O(nm)条边.所以优化建图. 考虑分块思想,设bs=sqrt(n),对于p大于bs的,直接连边即可,最多有sqrt(n)条, ...

  7. [CTSC2000]丘比特的烦恼

    Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...

  8. [ZPG TEST 110] 多边形个数【DP】

    1. 多边形个数 (polygons.pas/c/cpp) [问题描述] 给定N线段,编号1到n.并给出这些线段的长度,用这些线段组成一个K边形,并且每个线段做多使用一次.若使用了一条不同编号的线段, ...

  9. 数学 Codeforces Round #282 (Div. 2) B. Modular Equations

    题目传送门 题意:a % x == b,求符合条件的x有几个 数学:等式转换为:a == nx + b,那么设k = nx = a - b,易得k的约数(>b)的都符合条件,比如a=25 b=1 ...

  10. APP增量更新

    增量更新的概念: 当我们手机上安装的app版本与服务器的最新版本不一致的时候,传统做法是重新下载安装一个最新版的apk文件,不过这种方式比较耗流量,不利于用户体验.增量更新就是只下载当前app版本与最 ...