
最近,有一个大大的二维码解码秘密被揭晓了!这部份解码代码超级关键,可以让我们的二维码解码变得更犀利!听说这个大发现是一个超级厉害的博客主在他的文章里分享的。
├─aztec 二维码
│ ├─decoder 解码
│ ├─detector 定位
│ └─encoder 编码
├─client
│ └─result
├─common
│ ├─detector
│ └─reedsolomon
├─datamatrix 二维码
│ ├─decoder 解码
│ ├─detector 定位
│ └─encoder 编码
├─maxicode 二维码
│ └─decoder 解码
├─multi 识别图中多个码
│ └─qrcode
│ └─detector 定位
├─oned 一维码
│ └─rss 一维码和二维码的组合码
│ └─expanded 为rss提供服务
│ └─decoders 解码
├─pdf417 二维码
│ ├─decoder 解码
│ │ └─ec
│ ├─detector 定位
│ └─encoder 编码
└─qrcode 二维码
├─decoder 解码
├─detector 定位
└─encoder 编码
在上几篇博文中,咱们了解到了Zxing解码里最关键的五大类,还亲自操刀上阵体验了下解码的过程。掌握好这些知识,日常使用Zxing解码就没什么问题。不过其实,Zxing解码里面还有很多深奥点的内容~
不过说到底,我们得了解在各种情境之下的解码现象,比如解读联系人或者电邮啥的。这些就是咱们平时用二维码扫一扫时最需要看重的事情。
博客里,作者给大家科普了zxing解除码那儿那些相关的类,特别提到了DecodeHint Manager这个类。这货就是把解码像变成解码结果那种事搞定咯。不过别看人家方法看起来牛逼哄哄的,像是整个环节都包办了,其实它真正管的是比如码啥时候埋哪儿呀啥的。其它那些核心步骤,还是留给别的类去处理。
这位作者还教你怎么使用各种类来找到二维码,比如那个名叫Detector的类、AlignementPatternFinder的类,还有FinderPatternInfo的类。这些类会自动帮你判定图片里的二维码是不是真的,即使它是斜的或者被遮住都无所谓。
另外,文章里还解释得很清楚Zxing解码算法是怎么回事儿。这个算法就是用两个for循环来查看图像,再根据if-else条件区分各种不同的情况,比如看看当前像素是黑的还是白的,或者了解一下现在已经扫描过的部分有多少了。这个算法人为制造了二维码变形但依然能够准确识别的环境。
对这个新突破,zxing开发团队的人说:“这下子给我们解码技术带来了实质性的进步。研究过各种情况下的解码,再看跟class有关的用处,就能满足更多的二维码扫描需求!”
哎你看!二维码现在用得超级多,商业、文化、教育这些都离不开它。而且,随着大家都在用这东西,咱要懂得怎么解读才行。
public final DetectorResult detect(Map<DecodeHintType,?> hints) throws NotFoundException, FormatException {
resultPointCallback = hints == null ? null :
(ResultPointCallback) hints.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK);
// 尝试在二维码中找到查找器模式。Finder图案是二维码三个角上的方形标记。
FinderPatternFinder finder = new FinderPatternFinder(image, resultPointCallback);
FinderPatternInfo info = finder.find(hints);
return processFinderPatternInfo(info);
}
protected final DetectorResult processFinderPatternInfo(FinderPatternInfo info)
throws NotFoundException, FormatException {
// 获取三个定位点位置
FinderPattern topLeft = info.getTopLeft();
FinderPattern topRight = info.getTopRight();
FinderPattern bottomLeft = info.getBottomLeft();
// 根据从三个查找器模式的位置导出的估计值,计算平均估计模块大小。
float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft);
if (moduleSize < 1.0f) {
throw NotFoundException.getNotFoundInstance();
}
// 通过二维码信息判断版本
int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize);
Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension);
int modulesBetweenFPCenters = provisionalVersion.getDimensionForVersion() - 7;
AlignmentPattern alignmentPattern = null;
// 版本1以上的任何内容都有alignment pattern(即二维码右下角的校验位)
if (provisionalVersion.getAlignmentPatternCenters().length > 0) {
// 猜测“右下角”查找器模式会在哪里
float bottomRightX = topRight.getX() - topLeft.getX() + bottomLeft.getX();
float bottomRightY = topRight.getY() - topLeft.getY() + bottomLeft.getY();
float correctionToTopLeft = 1.0f - 3.0f / modulesBetweenFPCenters;
int estAlignmentX = (int) (topLeft.getX() + correctionToTopLeft * (bottomRightX - topLeft.getX()));
int estAlignmentY = (int) (topLeft.getY() + correctionToTopLeft * (bottomRightY - topLeft.getY()));
// 有点随意——在放弃搜索alignment pattern之前扩大搜索半径
for (int i = 4; i <= 16; i <<= 1) {
try {
alignmentPattern = findAlignmentInRegion(moduleSize,
estAlignmentX,
estAlignmentY,
i);
break;
} catch (NotFoundException re) {
// 试试下一轮
}
}
// 没有找到alignment pattern
}
// 经过图像扭曲处理后的图片
PerspectiveTransform transform =
createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension);
BitMatrix bits = sampleGrid(image, transform, dimension);
ResultPoint[] points;
if (alignmentPattern == null) {
points = new ResultPoint[]{bottomLeft, topLeft, topRight};
} else {
points = new ResultPoint[]{bottomLeft, topLeft, topRight, alignmentPattern};
}
return new DetectorResult(bits, points);
}
zxing这个免费的二维码解码工具一直很给力,专门帮咱们搞定快速又准确的解码问题。近几年,随着手机越来越流行,以及摄像头技术也变得越来越好,扫二维码已经成了我们生活中的小动作。
public final BitMatrix getBits() {
return bits;
}
public final ResultPoint[] getPoints() {
return points;
}
业界人士说,ZXing里这个破绽对于改进二维码解读还是挺有效果滴~ 了解了不同情境下的解析结果和class的作用,就能更善于应对各种各样扫码的问题,还能让解码更准确快狠准!
这个发现会让我们的二维码解码技术变得更好!了解了更多关于ZXING解码代码在各种情况下如何处理解码结果后,我们就可以更得心应手地解决在实际运用中遇到的问题,让解码变得更快也更准。
这一发现不仅能让二维码更牛逼,还会让它更方便地用到商业、文化、教育等各种地方。因为解码技术越来越强大了!
这ZXING码解码新的发现能给我们解码二维码这个事儿大大加点分!分析解码效果在各种情况下什么样儿,搞清楚各种类别的作用,开发人员就能根据真实需求来改进二维码扫描仪了,准确度和速度都能上去。这样一年下来,二维码技术肯定能更好更猛发展!
大家别忘了在评论区说说你们的想法,经验也是宝贵的!别忘了把这篇文章扩散出去,让更多的朋友看到这个突破性成果。
