`

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

 
阅读更多

转自:http://blog.csdn.net/xyz_fly/article/details/8053815

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


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

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

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

 

[java] view plaincopy
 
  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 plaincopy
 
  1. // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数  
  2. BitMatrix bitMatrix = new MultiFormatWriter().encode(content,  
  3.                     BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, qrParam);  


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

 

 

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

 

 

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

 

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


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

 

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

 

[java] view plaincopy
 
  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.     // 设置头像要显示的位置,即居中显示  
  10.     int left = (QRCODE_SIZE - portrait_W) / 2;  
  11.     int top = (QRCODE_SIZE - portrait_H) / 2;  
  12.     int right = left + portrait_W;  
  13.     int bottom = top + portrait_H;  
  14.     Rect rect1 = new Rect(left, top, right, bottom);  
  15.   
  16.     // 取得qr二维码图片上的画笔,即要在二维码图片上绘制我们的头像  
  17.     Canvas canvas = new Canvas(qr);  
  18.   
  19.     // 设置我们要绘制的范围大小,也就是头像的大小范围  
  20.     Rect rect2 = new Rect(00, portrait_W, portrait_H);  
  21.     // 开始绘制  
  22.     canvas.drawBitmap(portrait, rect2, rect1, null);  
  23. }  

 

 

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


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

自己生成的二维码:

 

新浪微博二维码:

 

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

 

扫描二维码下载应用原理是1:判断扫描结果是URL,2:将URL通过Intent发送出去

参考:http://blog.csdn.net/demands/article/details/9169897

分享到:
评论

相关推荐

    仿新浪微博二维码

    【标题】:“仿新浪微博二维码”涉及的技术点主要集中在二维码生成和自定义设计上,特别是如何利用ZXing库来实现这一过程。ZXing,全称Zebra Crossing,是一个开源的、跨平台的条码读写库,支持多种类型的条码和...

    二维码制作zxing开发文档zxing-api.chm

    二维码制作zxing的开发文档zxing-api.chm 自己制作的

    android 二维码扫描Zxing

    ZXing(Zebra Crossing)是Google开发的一个开源项目,它提供了跨平台的二维码和条形码处理库。本文将详细介绍如何在Android应用中集成ZXing实现二维码扫描功能,并提供对源码的修改建议。 首先,我们需要了解ZXing...

    zxing.net 最新版生成二维码,读取二维码,读取多个二维码。

    - 读取二维码是ZXing.Net的核心功能之一。使用`LuminanceSource`和`BinaryBitmap`类,库能够从图像中提取并解析二维码数据。`MultiFormatReader`类则负责识别多种格式的条形码和二维码,确保了对不同标准的兼容性。...

    重新编译的可使用byte[]生成二维码的zxing-core-3.4.0

    对zxing的core3.4.0新增了使用byte数组生成二维码的方法和解码方法,新增内容详细代码和使用方法参考: 改写步骤:zxing使用byte数组生成二维码和解析二维码。...使用方法:java压缩字符串并生成二维码...

    使用Java zxing开发的二维码 带logo彩色二维码

    本文将详细讲解如何使用Java与ZXing(Zebra Crossing)库来开发带logo的彩色二维码,以及涉及到的图片比例压缩技术。 **ZXing库介绍** ZXing(读作“zebra crossing”,斑马线)是一个开源的多格式一维和二维条码...

    zXing识别二维码源码

    **zXing识别二维码源码详解** zXing(Zebra Crossing)是一个开源的、跨平台的条形码和二维码解码库。它由Google开发并维护,支持多种格式的条形码和二维码,如QR码、Data Matrix、Aztec、UPC、EAN等。在本源码中,...

    使用zxing识别一幅包含多个二维码的图片

    在IT行业中,二维码(Quick Response Code)已经成为数据交换和信息传递的重要载体,广泛应用于广告、支付、产品追溯等领域。ZXing(Zebra Crossing...对于涉及大量二维码处理的项目,ZXing无疑是首选的解决方案之一。

    android二维码开发 ZXing(中文乱码已处理)

    在Android平台上进行二维码开发时,ZXing(Zebra Crossing)是一个非常流行的开源库,它提供了多种条码和二维码的读取与生成功能。本项目针对ZXing进行了优化,特别是解决了中文乱码的问题,使得开发者在处理包含...

    Android使用Zxing库识别多个二维码

    Android使用Zxing库识别多个二维码

    java二维码解析 zxing2.2及QRCode实现

    Java二维码解析技术主要涉及到两个库,一个是ZXing(Zebra Crossing)2.2,另一个是QRCode.jar。这两个库在处理二维码的生成和解析方面都提供了强大的支持。 ZXing,通常被称为“条形码扫描器”,是一个开源项目,...

    Android生成和扫描二维码之ZXing

    在Android平台上,生成和扫描二维码是一项常见的功能,ZXing(Zebra Crossing)是一个开源项目,提供了跨平台的条形码和二维码处理库。本篇文章将深入探讨如何在Android应用中利用ZXing实现二维码的生成与扫描。 ...

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

    Google的Zxing(ZXing,发音为“zebra crossing”)库提供了一个全面的解决方案,它支持多种类型的条形码和二维码的生成与扫描。这个教程将指导你如何使用Zxing库来创建一个类似微信的二维码扫描应用。 首先,你...

    java 生成二维码 ZXing

    Java 生成二维码是一种常见的数据编码需求,ZXing(Zebra Crossing)是一个开源的、多格式的一维/二维条码图像处理库,它支持多种条码和二维码的生成与解码。在Java中利用ZXing库生成二维码,可以方便地将文本、链接...

    zxing_DELHI2D_delphi二维码_ZXing_二维码_zxingdelphi7_

    标题中的"zxing_DELHI2D_delphi二维码_ZXing_二维码_zxingdelphi7_"提到了几个关键术语,它们都是与二维码处理相关的。ZXing(又称为Zebra Crossing)是一个开源的、多平台的条码和二维码读取库,而DELHI2D则可能指...

    Android zxing二维码扫描 从相册选择二维码识别

    在Android开发中,ZXing(Zebra Crossing)是一个开源项目,提供了一套全面的二维码和条形码处理库。这个项目不仅支持生成二维码和条形码,还支持扫描和解析这些编码,使得开发者能够轻松地在应用中集成二维码功能。...

    扫描二维码(zxing)

    ZXing(Zebra Crossing)是Google开发的一个开源的、跨平台的条码读取库,支持多种类型的条码和二维码,包括QR码。在Android平台上,ZXing常用于实现二维码的生成与扫描功能。 本文将详细讲解如何使用ZXing库在...

    delphixe7 android二维码扫描ZXing

    【标题】"Delphi XE7 Android二维码扫描ZXing"涉及的是在Delphi XE7环境下,使用ZXing库开发Android应用,实现二维码和条形码的扫描功能。ZXing,全称为“Zebra Crossing”,是一款开源的多平台条码读取库,支持多种...

    vb生成二维码QRCODE,使用zxing

    总之,ZXing库为VB.NET开发者提供了一种简单而强大的方式来生成二维码,使得在.NET 2.0及更高版本的应用程序中实现二维码功能变得轻而易举。通过理解和掌握这些基础知识,你就可以在自己的项目中灵活地应用二维码...

    java生成二维码,zxing二维码jar

    "java生成二维码,zxing二维码jar"这个标题指出,我们将使用ZXing库中的jar包来完成这个任务。ZXing提供了两个主要的jar包:core.jar和javase.jar。 1. **core.jar**:这是ZXing的核心库,包含了基本的条码解码和...

Global site tag (gtag.js) - Google Analytics