ZXing采用Hashtable方式来保存设置参数,比如我们这里设置的纠错能力为H级别,设置编码类型为UTF-8:
// 用于设置QR二维码参数 Hashtable<EncodeHintType, Object> qrParam = new Hashtable<EncodeHintType, Object>(); // 设置QR二维码的纠错级别——这里选择最高H级别 qrParam.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 设置编码方式 qrParam.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数 BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, qrParam);
// 开始利用二维码数据创建Bitmap图片,分别设为黑白两色 int w = bitMatrix.getWidth(); int h = bitMatrix.getHeight(); int[] data = new int[w * h]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { if (bitMatrix.get(x, y)) data[y * w + x] = 0xff000000;// 黑色 else data[y * w + x] = -1;// -1 相当于0xffffffff 白色 } } // 创建一张bitmap图片,采用最高的图片效果ARGB_8888 Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); // 将上面的二维码颜色数组传入,生成图片颜色 bitmap.setPixels(data, 0, w, 0, 0, w, h);
/** * 创建QR二维码图片 */ private Bitmap createQRCodeBitmap() { // 用于设置QR二维码参数 Hashtable<EncodeHintType, Object> qrParam = new Hashtable<EncodeHintType, Object>(); // 设置QR二维码的纠错级别——这里选择最高H级别 qrParam.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 设置编码方式 qrParam.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设定二维码里面的内容,这里我采用我微博的地址 String content = "sinaweibo://userinfo?uid=2568190010"; // 生成QR二维码数据——这里只是得到一个由true和false组成的数组 // 参数顺序分别为:编码内容,编码类型,生成图片宽度,生成图片高度,设置参数 try { BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, qrParam); // 开始利用二维码数据创建Bitmap图片,分别设为黑白两色 int w = bitMatrix.getWidth(); int h = bitMatrix.getHeight(); int[] data = new int[w * h]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { if (bitMatrix.get(x, y)) data[y * w + x] = 0xff000000;// 黑色 else data[y * w + x] = -1;// -1 相当于0xffffffff 白色 } } // 创建一张bitmap图片,采用最高的效果显示 Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); // 将上面的二维码颜色数组传入,生成图片颜色 bitmap.setPixels(data, 0, w, 0, 0, w, h); return bitmap; } catch (WriterException e) { e.printStackTrace(); } return null; }
在前言中,已经对新浪微博二维码做了分析,它只是合理的利用了二维码的规则,在二维码基础上增加了一些装饰,也就是说,在生成好的二维码上,贴了张头像照。如果原理大家明白了的话,自己也就可以实现了。我这里附上在二维码图片基础上增加头像的方法:
/** * 在二维码上绘制头像 */ private void createQRCodeBitmapWithPortrait(Bitmap qr, Bitmap portrait) { // 头像图片的大小 int portrait_W = portrait.getWidth(); int portrait_H = portrait.getHeight(); // 设置头像要显示的位置,即居中显示 int left = (QRCODE_SIZE - portrait_W) / 2; int top = (QRCODE_SIZE - portrait_H) / 2; int right = left + portrait_W; int bottom = top + portrait_H; Rect rect1 = new Rect(left, top, right, bottom); // 取得qr二维码图片上的画笔,即要在二维码图片上绘制我们的头像 Canvas canvas = new Canvas(qr); // 设置我们要绘制的范围大小,也就是头像的大小范围 Rect rect2 = new Rect(0, 0, portrait_W, portrait_H); // 开始绘制 canvas.drawBitmap(portrait, rect2, rect1, null); }
最后附上截图比对一下,截图上为正常二维码,下面为增加头像的二维码。与新浪微博生成二维码的对比一下,基本一样。
自己生成的二维码:
新浪微博二维码:
附上完整代码工程:仿新浪微博二维码