使用zxing解析二维码抛出com.google.zxing.NotFoundException 解决方案
调用zxing使用摄像头进行二维码扫描,没什么问题;当选取手机本地相册二维码进行解析时,简单的也没问题。但二维码复杂了,比如中间有LOGO的时候就会抛出com.google.zxing.NotFoundException的异常。
可能存在以下情况,但这不是我最终的解决方案,我用了最后一个解决方案:
1、二维码所有bit都是0,然后分析了一下,发现我在生成二维码的时候白色像素填充使用的是透明色,这样在显示的时候因为背景是白色,所以看上去和用手机扫都没有问题,但是自己代码识别的时候就会把透明色识别为黑色,这样就导致整个二维码图片全是黑色像素,所以zxing抛出com.google.zxing.NotFoundException异常。
2、乱码。
-
// 解码设置编码方式为:utf-8,
-
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
3.优化精度。
-
//优化精度
-
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
4.开启PURE_BARCODE模式。(这是解决我的方案,带图片LOGO的解码方案)
-
//复杂模式,开启PURE_BARCODE模式
-
hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
第4个方案,是解决我的问题的方案,大家可以试试。
附上我的部分解码代码源码,具体如何扫描手机本地相册二维码图片,可以参考githup上的开源项目zxing
-
/**
-
* 流图片解码
-
* @param input
-
* @return QRResult
-
*/
-
public static QRResult decode(InputStream input) {
-
BufferedImage image;
-
try {
-
if (null == input) {
-
return "得到的文件不存在!;
-
}
-
image = ImageIO.read(input);
-
LuminanceSource source = new BufferedImageLuminanceSource(image);
-
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
-
- Map<DecodeHintType,Object> hints = new LinkedHashMap<DecodeHintType,Object>();
-
// 解码设置编码方式为:UTF-8,
-
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
-
//优化精度
-
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
-
//复杂模式,开启PURE_BARCODE模式
-
hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
-
Result result = new MultiFormatReader().decode(bitmap, hints);
-
String txt = result.getText();
-
return "成功解码:"+txt);
-
} catch (Exception e) {
-
return "解码失败!";
-
}
-
}