现在的位置: 首页 > 综合 > 正文

记录Android端使用zbar扫描的相关问题。

2018年04月04日 ⁄ 综合 ⁄ 共 2311字 ⁄ 字号 评论关闭

转载来自www.eoeandroid.com/forum.php?mod=viewthread&tid=332855&page=1&ordertype=1

提供NDK打包zbar源码帮助http://www.blackdogfoundry.com/blog/zbar-bar-code-qr-code-reader-android/

在此一并做一下记录。

修改Zbar有效扫描区域的关键代码,在CaptureActivity中initCamera函数中

CameraManager.get().openDriver(surfaceHolder);

			Point point = CameraManager.get().getCameraResolution();
			int width = point.y;
			int height = point.x;

			int x = mCropLayout.getLeft() * width / mContainer.getWidth();
			int y = mCropLayout.getTop() * height / mContainer.getHeight();

			int cropWidth = mCropLayout.getWidth() * width / mContainer.getWidth();
			int cropHeight = mCropLayout.getHeight() * height / mContainer.getHeight() - (iHeight - height);// 由于扫描框的大小,比实际扫描的高度矮,故减去(iHeight - height)的高度

			setX(x);
			setY(y);
			setCropWidth(cropWidth);
			setCropHeight(cropHeight);

解码并保存图片的相关代码,在DecodeHandler中decode函数中

private void decode(byte[] data, int width, int height)
	{
		byte[] rotatedData = new byte[data.length];
		for (int y = 0; y < height; y++)
		{
			for (int x = 0; x < width; x++)
				rotatedData[x * height + height - y - 1] = data[x + y * width];
		}
		int tmp = width;// Here we are swapping, that's the difference to #11
		width = height;
		height = tmp;

		ZbarManager manager = new ZbarManager();
		String result = manager.decode(rotatedData, width, height, true, activity.getX(), activity.getY(), activity.getCropWidth(), activity.getCropHeight());

		if (result != null)
		{
			if (activity.isNeedCapture())
			{
				// 生成bitmap
				PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(rotatedData, width, height, activity.getX(), activity.getY(), activity.getCropWidth(),
						activity.getCropHeight(), false);
				int[] pixels = source.renderThumbnail();
				int w = source.getThumbnailWidth();
				int h = source.getThumbnailHeight();
				Bitmap bitmap = Bitmap.createBitmap(pixels, 0, w, w, h, Bitmap.Config.ARGB_8888);
				try
				{
					String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Qrcode/";
					File root = new File(rootPath);
					if (!root.exists())
					{
						root.mkdirs();
					}
					File f = new File(rootPath + "Qrcode.jpg");
					if (f.exists())
					{
						f.delete();
					}
					f.createNewFile();

					FileOutputStream out = new FileOutputStream(f);
					bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
					out.flush();
					out.close();
				}
				catch (Exception e)
				{
					e.printStackTrace();
				}
			}

			if (null != activity.getHandler())
			{
				Message msg = new Message();
				msg.obj = result;
				msg.what = R.id.decode_succeeded;
				activity.getHandler().sendMessage(msg);
			}
		}
		else
		{
			if (null != activity.getHandler())
			{
				activity.getHandler().sendEmptyMessage(R.id.decode_failed);
			}
		}
	}

界面自定义扫描框,可在CaptureActivity中自定义即可。也可仿照ZXing的ViewfinderView界面编写自己的布局。



抱歉!评论已关闭.