二维码之zxing仿新浪微博二维码

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

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

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

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

[java] view plain copy

  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");

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

[java] view plain copy

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

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

[java] view plain copy

  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版完整生成二维码的代码:

[java] view plain copy

  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. }

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

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

[java] view plain copy

  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、如果要仿照腾讯微信,在二维码边上增加装饰框,记得一定要在装饰框和二维码之间留出白边,这是为了二维码可识别。

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

自己生成的二维码:

新浪微博二维码:

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

时间: 2024-08-14 00:01:42

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

java利用zxing生成仿新浪微博二维码

原文:java利用zxing生成仿新浪微博二维码 源代码下载地址:http://www.zuidaima.com/share/1550463729896448.htm 效果图: 说明在readme.txt文件

【Android重量级源码】高仿大众点评源码

高仿大众点评源码   下载地址:http://url.cn/Nzj3Lc   源码简介声明:本源码只用于个人研究使用,不可用于商业用途,由于本源码引起的纠纷皆与作者无关. 本套源码是本人在校的时候做的一个练手的列子,高仿大众点评,项目源码不算是太完善,还请专业人士指导并完善他. 源码部分没有完成,服务器部分也不是太完善,只是实现了查询方面的东西. 由于现在没有时间去优化,所以把源码发出来给新手们参考学习,代码不规范的地方还请扣扣告诉我, 我想多向大家学习,充实自己,希望大家多多提供意见让我更快的

iOS新闻应用源码,高仿今日头条源码等

iOS精选源码 城市列表选择 一款非常时尚的照片选择插件 优酷播放按钮动画 BRPickerView是iOS的选择器组件,主要包括:日期选择器.时... 选择位置坐下动画Demo BAButton 图片.文字.倒计时等 git 功能最全的 button 分类 企业级完整iOS项目-<新闻来了> 较为美观的多级展开列表 高仿今日头条6.2.6 Swift 简单画板的swift实现 iOS优质博客 创建一个私有的 Pods 详解 前言骚年,你听说过组件化吗?没有?但你一定玩过乐高玩具,乐高玩具本身

ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(goole)生的,QRCode就不用说了吧,虽说技术无国界,但是国人还是有点.... 好,言归正传,java用ZXi

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

一.目标 输入网址,生成网址的二维码 二.概况 1.效果:UI丑,但功能实现了 2.项目目录 三.用到的第三方资源 1.google的扫码包zxing 2.JQuery 四.步骤(用myEclipse) 1.新建工程,选择web project 2.加入第三方资源(zxing包和jQuery) 2.1 2.1.1复制,粘贴,加入zxing的jar包(所有文件在附件中下载) 2.2.2右键jar包加入buildpath 2.2加入jQuery文件 2.2.1在WebRoot下新建文件夹js 复制粘

使用zxing批量生成二维码立牌

使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址.文本等)生成二维码并放在该位置, 最后加上立牌编号. 步骤: 1).做好背景图,如下图: 2).生成二维码BufferedImage对象.代码如下: /** * * @Title: toBufferedImage * @Description: 把文本转化成二维码图片对象 * @param text * 二维码内容 * @param width * 二维码高度 * @param height * 二位宽度 * @par

条码扫描二维码扫描—ZXing android 改进版本

看了Vurtexゞ. 文章<[Android实例] 条码扫描二维码扫描——ZXing android 源码简化 (附:支持中文) >的基础上对代码进行了修改 1.增加了将代码嵌套入自己工程后传值的办法(初学,如果有更好的方法也希望告诉我,先谢谢了) 2.扫码界面进行了处理(初步实现了现有某些软件的样子,至于长的像谁就不说了) //画四个角的代码<br>paint.setColor(frameColor); canvas.drawRect(15 + frame.left, 15 +

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

一.ZXing.Net 源代码地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如图: 说明:ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android.现在也有了对应的.Net版本 二.生成二维码 将字符编码时可以指定字符格式:默认为ISO-8859-1英文字符集,但一般移动设备常用UTF-8字符

在Android用ZXing.jar识别二维码的精简版(简化了配置和代码)

最近公司做了一款OTP令牌激活的产品,由于之前激活手机令牌需要输入很多的激活信息才能进行激活.经过一段使用后,发现易用性不是很强,考虑如果加入二维码的的扫码功能岂不是大大增加了易用性.     在网上搜了很多资料,要不是配置太多,要不就是代码量太大,最后没办法就硬着头皮去写和去精简,最后压缩至目前的版本.如果有更好的版本可以联系我. 具体DEMO可以通过 下载http://download.csdn.net/detail/fugui6611634/7341277下载 本文代码运行的结果如下: 代