`
xindrace
  • 浏览: 93653 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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();
	  
  }

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

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

 

  • 大小: 113.3 KB
3
0
分享到:
评论
2 楼 sincerehui 2013-08-21  
   
1 楼 bravewly 2013-03-19  
为啥扫不出结果呢?
是我扫的方式不对么?

相关推荐

    QRCode.jar包和二维码编码与解码的实现

    QRCode.jar包和二维码编码与解码的实现

    Qr 二维码 编码及解码

    Qr 二维码 编码及解码 完整Eclipse项目,jdk1.5

    android二维码 直接对图片编码解码

    这个是帮同学做完毕业设计后留下的东西,其实也就是到网上收集点资料整合下,不过支持android的资源真的很少,看在辛苦的份上,希望大家可怜点分点我,使用遇到问题的同学也可以联系我QQ:379754895,本人专职ios开发...

    Java版二维码编码与解码

    完整二维码编码和解码包,本人收集整合成一个包,并附带完整的工具方法和运行例子可直接使用到手机客户端或应用。 解压后,引用TwoDimCode.jar包,运行使用TwoDimCode.java 绝对超值,下载看看吧!

    QR二维码编码及解码程序

    这是QR二维码的编码和解码程序,两个工程放在同一个工作空间中,便于大家学习,调试程序,已经在VC6.0下成功编译,运行正常。

    C#二维码编码和解码

    在csdn下载的qrcode,在vs2010下编译总是有错,于是我重新封装了一下,win7+vs2010下测试通过。生成的二维码图片使用iphone4的识别软件准确无误,放上源代码,大家一起研究一下。

    java的二维码编码与解码

    很简单的一个java二维码编码与解码的说明文档,只需要你创建一个java程序,将代码复制过去就能用,新手也能看明白哦

    二维码编码解码器源码20130905

    二维码编码解码器源码 本源码实现可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;二维码也开始应用到很多场合,如火车票有二维码识别、网易的首页有二维码...

    Android二维码生成和解码源代码

    Android平台的二维码生成和解码的源代码,基于开源zxing的代码,在eclipse下可以直接导入android项目,已经在模拟器和真机上测试过了,是学习和测试的不二之选

    C# 二维码编码和解码代码实现不调用控件

    C#写的二维码编码类和二维码解码类,不调用任何控件,方便翻译成任何语言,可在任意平台上运行。 内有说明文档,说明怎样设置和调用,使用非常的方便,编码一个类,解码一个类,不像网上搜索的那些各种复杂不好用,...

    二维码编码/解码器

    一个能将网址编码成二维码或将二维码解码成网址的小工具。

    java二维码编码解码测试

    java二维码编码解码测试 java QRCoder 二维码 编码 解码 java QRCoder 二维码 编码 解码

    最新二维码编码与解码平台(PDF417/QrCode/DataMatrix)

    2012年最新二维码编码和解码程序套件,是开发二维条码生成和自动识别应用参考实例。自动识别PDF417、QRCODE、DataMatrix和HanXin条码图形,同时又能将文本、图像、声音和指纹混合编码,生成二维条码。二维码种类包括...

    C#二维码编码解码器源码

    C#二维码编码解码器源码

    二维码编码解码源代码qr实.rar

    软件的开发平台是.net 开发,开发环境是 vs2010 实现功能是 qr二维码编码 解码

    java 二维码编码解码

    Java实现二维码QRCode的编码和解码

    各种类型二维码的编码解码

    涵盖了多种常用二维码编码,解码的代码,算是个总结

    条形码和二维码编码和解码

    条形码和二维码编码和解码(通过引用zxing) 条形码:编码方式:EAN_13编码;EAN_8编码;Code39编码 二维码:编码方式:QRCode编码

    二维码 java android 编码 解码 jar

    二维码 java android 编码 解码 jar QRcode PDF417

Global site tag (gtag.js) - Google Analytics