android二维码的编码与解码(图片解码与摄像头解码)

今天上网找了找可以从图片解析二维码 ,而不是从摄像头,找了半天,终于找到了居然不全,所以自己查资料,写了一个 可以生产二维码,并且从图片和摄像头都可以解析的demo。



 

二维码其实很简单,我用的是Google的ZXing的源代码(在后面的附件里有)。

下面来看一下代码,注释我已经写的很明白了,就不解释了。

生成二维码图片

// 生成QR图
	private void encodeQRCode() {
		try {
			// 读取输入的String
			String text = qr_text.getText().toString();
			Log.i(TAG, "生成的文本:" + text);
			if (text == null || "".equals(text) || text.length() < 1) {
				return;
			}
			// android二维码的编码与解码(图片解码与摄像头解码)

			// 实例化二维码对象
			QRCodeWriter writer = new QRCodeWriter();
			// 用一个map保存编码类型
			Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
			// 保持字符集为“utf-8”
			hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
			/* 
			 * 第一个参数:输入的文本
			 * 第二个参数:条形码样式-》二维码
			 * 第三个参数:宽度
			 * 第四个参数:高度
			 * 第五个参数:map保存编码类型
			 */
			BitMatrix bitMatrix = writer.encode(text, BarcodeFormat.QR_CODE,
					QR_WIDTH, QR_HEIGHT, hints);
			System.out.println("w:" + bitMatrix.getWidth() + "h:"
					+ bitMatrix.getHeight());
			// 将像素保存在数组里
			int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
			for (int y = 0; y < QR_HEIGHT; y++) {
				for (int x = 0; x < QR_WIDTH; x++) {
					if (bitMatrix.get(x, y)) {// 二维码黑点
						pixels[y * QR_HEIGHT + x] = 0xff000000;
					} else {// 二维码背景白色
						pixels[y * QR_HEIGHT + x] = 0xffffffff;
					}

				}
			}
			
			// 生成位图
			Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
					Bitmap.Config.ARGB_8888);
			/* 
			 * 第一个参数:填充位图的像素数组
			 * 第二个参数:第一个颜色跳过几个像素读取
			 * 第三个参数:像素的幅度
			 * 第四个参数:起点x坐标
			 * 第五个参数:起点y坐标
			 * 第六个参数:宽
			 * 第七个参数:高
			 */
			bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
			// 显示图片
			qr_image.setImageBitmap(bitmap);
		} catch (WriterException e) {
			e.printStackTrace();
		}
	}

 解析二维码图片:

// 解析QR图片
	private void decodeQRCode() {
		Map<DecodeHintType, String> hints = new HashMap<DecodeHintType, String>();
		hints.put(DecodeHintType.CHARACTER_SET, "utf-8");

		Bitmap bitmap = ((BitmapDrawable) qr_image.getDrawable()).getBitmap();
		RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
		// 转成二进制图片
		BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
		// 实例化二维码解码对象
		QRCodeReader reader = new QRCodeReader();
		Result result;
		try {
			// 根据解码类型解码,返回解码结果
			result = reader.decode(bitmap1, hints);
			System.out.println("res:》》》》》》》:" + result.getText());
			// 显示解码结果
			qr_result.setText(result.getText());
		} catch (NotFoundException e) {
			e.printStackTrace();
		} catch (ChecksumException e) {
			e.printStackTrace();
		} catch (FormatException e) {
			e.printStackTrace();
		}
	}

 用摄像头解析就更简单了,直接Intent到ZXing中的CaptureActivity类 就OK了。

但是这样扫描完的二维码,自己也用不了呀。不用着急在CaptureActivity类的530行,也就是

 // 条码/二维码结果
  private void showResult(Result rawResult, ResultHandler resultHandler, Bitmap barcode)
  {
	  AlertDialog.Builder builder = new AlertDialog.Builder(this);
	  CharSequence displayContents = resultHandler.getDisplayContents();
	    if (barcode == null) {
	      builder.setIcon(R.drawable.launcher_icon);
	    } else {
	      
	    Drawable drawable = new BitmapDrawable(barcode);
	      builder.setIcon(drawable);
	    }

	    builder.setTitle("Result");
        builder.setMessage(displayContents);
        builder.setPositiveButton("OK",new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				Intent intent = new Intent(CaptureActivity.this,CaptureActivity.class);
				startActivity(intent);
			}
		});
        builder.setNegativeButton(R.string.button_cancel, new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				CaptureActivity.this.finish();
				
			}
		});
        builder.show();
	  
  }

 这个方法中把所有的扫描结果返回了。你可以根据自己的选择往下写逻辑就行了。

源码都在附件里,有兴趣的可以看一下。

猜你喜欢

转载自xindrace.iteye.com/blog/1704667