解决Zxing解析本地图片二维码,识别率低,识别不出来的问题!

       (又做了一些优化,就是在原来的基础上添加上了zbar识别二维码的功能,就是先对图片进行处理,然后通过zxing识别,如果zxing识别失败,再通过zbar识别 20170329)

       最近项目里让添加本地图片扫描二维码的功能,本来已经加了扫一扫的功能,产品非得让加上本地图片扫码功能,我看了下搜狐和优酷,他们都是只有扫一扫,没有本地图片扫码,我就想着,产品让加就加吧。

在网上搜了搜,很快就搜到了一个demo,也很快就加到我的项目中了,截取了一张二维码的图片,识别出来了,OK,功能加好了,真开心。后来测试一测,说二维码功能没有添加,我就和他们理论,让他们过来复现,结果真的是识别不出来二维码,到底是啥原因啊,我就开始思考,因为他们是用手机拍得一张二维码图片,二维码在整个图片中占的比例很小,我那天自己测的时候,是整张图片基本上被二维码占完了,所以能扫描成功,接着就是解决问题。

一开始上网搜,zxing二维码本地图片识别不出来,识别率低,搜了半天搜出来一个把图片放大,比如放大一倍,这样就可以识别出来了,下面我把把图片放大的代码贴出来,

Bitmap scanBitmap;

     int sampleSize=(int)(options.outHeight/(float)200);
    options.inJustDecodeBounds=false;
    if(sampleSize<=0){
       options.inSampleSize=1;
       scanBitmap=BitmapFactory.decodeFile(path, options);
       Matrix matrix=new Matrix();
       matrix.postScale(1.5f,1.5f);
       scanBitmap=Bitmap.createBitmap(scanBitmap,0,0,scanBitmap.getWidth(),scanBitmap.getHeight(),matrix,true);
    }else{
       options.inSampleSize=sampleSize;
       scanBitmap=BitmapFactory.decodeFile(path,options);
    }
然而并没什么用,不仅没什么用,由于把图片放大了,还可能会造成outofmemory,然后就接着搜索,有人说用zbar,说它的图片二维码的识别率比zxing得高,我实在不想改,不过也没办法,就用zbar试了下,然而并没有什么用,这个时候,有点小崩溃,下班后回到家,就一直想到底是为什么呢,ios的就能识别出来,他们用的是他们系统自带的api来做的,难道是他们ios的扫一扫的apI里的算法比zxing和zbar的效率性能要好,肯定的了,不然为什么同样的图片他们的就能识别出二维码呢(猜得),接着继续想办法,然后就是回忆一下,自己手上的其他项目里有没有这些类似的功能参考下,想了一遍,也没有,但是有从相册中获取图片然后截取图片的功能,然后就又有思路了,对了,图片上的二维码识别不出,是因为二维码在整张图片中的占的比例太小,我能不能对这整张图片进行一下裁剪,把没用的多余的图片部分裁剪掉,接着就开始干,下面是对相册图片裁剪的代码:
public class ImageCropActivity extends BaseActivity {
   private static final int DEFAULT_ASPECT_RATIO_VALUES = 10;

   private CropImageView cropImageView;
   private String pre_path; 
   private boolean pre_flag;
   private int screen_width, screen_height;
   private TextView tv_ok, tv_canle;
   private int x;
   private int y;
   private TextView tv_crop;

   private RelativeLayout rl_layout;
   
在Vue中使用zxing库进行二维码识别的过程相对简单。首先,我们需要安装zxing库,可以使用npm命令进行安装: ``` npm install zxing --save ``` 安装完成后,我们可以在Vue组件中引入zxing库: ```javascript import zxing from 'zxing'; ``` 然后,我们可以在Vue组件的方法中使用zxing库来识别二维码。例如,我们可以在一个点击事件中对图片进行二维码识别: ```javascript methods: { handleQRCodeRecognition() { const image = new Image(); image.src = 'path/to/your/image.jpg'; image.onload = () => { const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); canvas.width = image.width; canvas.height = image.height; context.drawImage(image, 0, 0, image.width, image.height); const binaryBitmap = zxing.BinaryBitmap.createBinarizer( new zxing.RGBLuminanceSource(canvas, image.width, image.height) ); try { const result = new zxing.qrcode.QRCodeReader().decode(binaryBitmap); console.log(result.getText()); } catch (error) { console.error(error); } }; } } ``` 在以上代码中,我们首先创建了一个图片对象,并将其路径设置为要识别图片。然后,在图片加载完成后,我们创建一个canvas元素,并将图片绘制到canvas上。接下来,我们使用zxing库的相关方法,将canvas转换为BinaryBitmap对象,并使用QRCodeReader对二维码进行识别。如果识别成功,我们可以通过result.getText()方法获取二维码中的文本信息。 需要注意的是,由于zxing库依赖于DOM对象,因此以上代码只能在浏览器环境中使用,而不能在Node.js中使用。另外,为了确保识别效果,最好是使用高清晰度、清晰可见的二维码图片进行识别
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值