0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙 java 版本二维码识别扫描演示

OpenHarmony技术社区 来源:HarmonyOS技术社区 作者:HarmonyOS技术社区 2022-01-04 14:36 次阅读

周日在酒店撸了一下午,加晚上到12点,终于把摄像头扫码的 Java 版本撸了个大概。

可以实现的效果就是打开摄像头扫描一张二维码图片然后显示二维码里面的内容,看个视频一睹为快吧(界面待优化):

可以看到二维码扫描成功之后会在屏幕底下弹出一个带有内容的气泡。

其实我也不知道是怎么回事,对于扫码这么高频的需求官方竟然没有集成进来。

PS:最新的消息 js 已经集成了,但是 java 还没有,只有一个生成二维码的代码。

我翻了全网的文档找到了几个相关的:

这个是官方的 codelabs 的一篇帖子,无法模拟运行,就等于是个帖子,而且这帖子还被许多网友搬到了博客上。

https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/HarmonyOS-QRCode

这个帖子本身没毛病,但是他最大的问题就是没搞定,具体说来就是给你一个模糊的基础让你知道怎么回事而已,但是这帖子有一些可取的地方我们稍后再说。

这个是 HarmonyOS 的官方开发文档,里面有介绍怎么启用相机拍照,录视频。

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-camera-guidelines-0000000000031782

这个文档最大的作用就是告诉你怎么操作摄像头,但是对于扫码,只字未提。

这个基本没用,只有码生成而没有解析,差评。

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ai-code-genration-overview-0000001051062161

这个帖子是 javaAPI 的使用手册,同样只有码生成而没有解析,还是差评。

https://developer.harmonyos.com/cn/docs/documentation/doc-references/ibarcodedetector-0000001054120097

翻了一堆的帖子,我就纳闷了,二维码扫描这东西都出来这么多年了,技术上有啥难题吗,怎么全网都没有在弄的。

要知道,微信小程序里面可是直接自带扫码接口的呀!既然没有,就到了咱显一显身手的时候了,哈哈!

技术思路

其实思路基本没啥,咱们日常生活中碰到扫描无非是三种:

摄像头扫码

图片直接解

在微信上比较常见的长按某张图片帮你扫码,其实就是图片扫码一样的

这里咱们着重处理摄像头扫码,因为图片扫描是摄像头扫码后面那部分,就是你摄像头已经取得图片了,然后再解析扫码。

可以这样说:如果你学会了摄像头扫码,那么图片解析二维码你自动就会了,怎么样,是不是很心动,快跟我学起来吧!

原理:启用手机摄像头→摄像头预览→对准二维码→解析摄像头数据→保存成图片→发给二维码解析库解析→获取解析结果。

开工

①打开你的手机摄像头

摄像头的启用,怎么拍图片在这篇官方文档上讲的很清楚了:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/media-camera-guidelines-0000000000031782
而且文档下面还有一个 gitee 仓库给你看源码,这块我寻思不用多讲吧:
https://gitee.com/harmonyos/harmonyos_app_samples/tree/master/media/Camera

请首先顺利得能让你的手机拍一张照片出来,提示,此处有坑:真机调试时需要在手机权限里手动把摄像头权限打开,否则你得到的是一个黑屏。

这个问题折腾了我半个小时,我以为在代码里面加了权限,而手机也没有弹出权限提示框就以为权限是正常的,结果进到设置一看尼玛禁的死死的。

②把官方代码的图片保存函数替换掉

其实就是这个函数:

privatevoidsaveImage(ImageReceiverreceiver)

怎么改呢?咱有参考,还记得上面提到的官方 codelabs 吗?对就是他:

https://developer.huawei.com/consumer/cn/codelabsPortal/carddetails/HarmonyOS-QRCode

2de0b76e-5dd0-11ec-b2e9-dac502259ad0.png

这地方有怎么把你拍到的图片转换成 Pixel 像素图。

③上大招:zxing 闪亮登场

以下为心路历程:在官方的那个 codelabs 里面,最后一句话他说:—-结束。

what?怎么就结束了?当时给我看的那叫懵啊,不过好在咱有逻辑思维分析能力,往上翻,上一篇叫二维码识别,好,看吧:

2e120788-5dd0-11ec-b2e9-dac502259ad0.png

哦哦,引入一下这三个文件是吧,简单,我找一下哈…

请问文件在哪?唉不整了,玩个游戏先...打了会游戏,又觉无聊,唉,还是学习吧,谁叫咱热爱学习呢?

几经搜索,给我找到了一个叫做 zxing 的库,这个库着实强大,谷歌官方维护的,翻译一下这就叫惊喜,二话不多整活了。

下载 zxing 库:官方网址如下,最新版是 3.4.1,直接下载过来。

https://github.com/zxing/zxing

打开来一看,都是啥:

2e4d865a-5dd0-11ec-b2e9-dac502259ad0.png

这里面东西不少,但凭着咱技术人的直觉,自己只需要里面的 core,但是要怎么使用呢?官方 readme 上面有一句话:

2e939e6a-5dd0-11ec-b2e9-dac502259ad0.png

那咱打开吧:

https://github.com/zxing/zxing/wiki/Getting-Started-Developing

这里面有一句话引发了我的思考:

2ece1b62-5dd0-11ec-b2e9-dac502259ad0.png

对,说到心坎里了,我只要一个 jar 包。合着前面的下载白弄了…

其实有更好的方式:根据自己的悟性领悟了,Maven 转 gradle 的方式,直接在项目 build.gradle 里面加一句。

2efb867e-5dd0-11ec-b2e9-dac502259ad0.png

改完这个文件,ide 提示你要同步一下,点击同步,这时候 zxing-core 就集成到你的项目中了,方便。

2f2e72dc-5dd0-11ec-b2e9-dac502259ad0.png

集成,集成:这块我直接贴代码吧,讲起来有点啰嗦。

privatevoidsaveImage(ImageReceiverreceiver){

HiLog.info(LABEL_LOG,"==>saveImage");
ohos.media.image.Imageimage=receiver.readNextImage();
ohos.media.image.Image.Componentcomponent=image.getComponent(ImageFormat.ComponentType.JPEG);
byte[]jpgbytes=newbyte[component.remaining()];
component.read(jpgbytes);
HiLog.info(LABEL_LOG,"....==>saveImage:%{public}d",jpgbytes.length);

ImageSource.SourceOptionssourceOptions=newImageSource.SourceOptions();
sourceOptions.formatHint="image/jpg";
ImageSourceimageSource=ImageSource.create(jpgbytes,sourceOptions);
PixelMappixelMap=imageSource.createPixelmap(null);

intwidth=pixelMap.getImageInfo().size.width;
intheight=pixelMap.getImageInfo().size.height;

int[]pis=newint[width*height];


HiLog.info(LABEL_LOG,"pixnumberbyte%{public}d,size==>%{public}s"+
"w%{public}dh%{public}d",
pixelMap.getPixelBytesNumber(),
pixelMap.getBytesNumberPerRow(),
width,height);

try{

pixelMap.readPixels(pis,0,width,newRect(0,0,width,height));
}catch(Exceptione){
HiLog.error(LABEL_LOG,"readPixelserror:%{public}s",e.toString());
return;

}

RGBLuminanceSourcergbSource=newRGBLuminanceSource(
pixelMap.getImageInfo().size.width,pixelMap.getImageInfo().size.height,pis);


HiLog.info(LABEL_LOG,"source:%{public}s",rgbSource.toString());

LuminanceSourcesource=rgbSource.crop(0,0,rgbSource.getWidth(),rgbSource.getHeight());

BinaryBitmapbMap=newBinaryBitmap(newHybridBinarizer(source));

finalMaphints=newHashMap<>();
hints.put(DecodeHintType.CHARACTER_SET,"utf-8");
hints.put(DecodeHintType.POSSIBLE_FORMATS,BarcodeFormat.QR_CODE);
hints.put(DecodeHintType.TRY_HARDER,Boolean.TRUE);

QRCodeReaderreader=newQRCodeReader();

Resultresult=null;
try{
result=reader.decode(bMap,hints);
HiLog.info(LABEL_LOG,"==>result:"+result.toString());
showTips(this.getContext(),result.toString());
}catch(NotFoundExceptione){
HiLog.info(LABEL_LOG,"notfound:"+e.toString());
}catch(Exceptione){
HiLog.error(LABEL_LOG,"catchException:"+e.toString());
}


}

短短的 60 行左右就搞定了(实际上折腾了 5Hour+),前面一直到第 13 行大家都能看懂,就是转换 Pixel 图片,不懂的同学往上翻去复习哈。 后面就是把像素取出来,传给 zxing 去解析,核心代码在 QRcode.decode() 这里,前面的都是辅料。

打完收工:到这里我 java 版本的二维码识别扫描就初步完成了,大家可以行测试了。

总结

是不是感觉挺简单的,说来也是奇怪,这么简单的东西为啥就是没人做呢?借星光计划给大家发第一篇文章,一起期待下一篇吧!

原文标题:60行代码搞定鸿蒙“二维码扫描”功能!

文章出处:【微信公众号:HarmonyOS技术社区】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2960

    浏览量

    104587
  • 摄像头
    +关注

    关注

    59

    文章

    4819

    浏览量

    95526
  • 鸿蒙
    +关注

    关注

    57

    文章

    2325

    浏览量

    42766

原文标题:60行代码搞定鸿蒙“二维码扫描”功能!

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview调用Halcon识别二维码

    Labview调用Halcon识别二维码 可一次识别多个二维码 使用Labview 2020编辑,halcon的版本是 19.11,32位
    发表于 02-21 16:31

    分享一款二维码扫描软件

    【芝麻客】二维码扫描软件下载功能详细介绍 如果你已经下载了芝麻客二维码扫描软件你可以跳过以下环节,假如你的手机已经安装了二维码
    发表于 11-13 14:36

    二维码识别

    `利用笔记本电脑的摄像头采集二维码图像并识别,显示二维码的信息!下载了labview视觉与运动模块的可以下来看看!里面有2张二维码,用二维码
    发表于 08-27 16:52

    扫描器识别二维码

    扫描器识别二维码
    发表于 02-23 20:55

    OpenHarmony应用实现二维码识别

    本文转载自《OpenHarmony应用实现二维码识别》,作者zhushangyuan_ 概念介绍 二维码的应用场景非常广泛,在购物应用中,消费者可以直接
    发表于 08-23 17:00

    NLS-EM25二维码扫描模组形象,二维扫描模组适合哪些场所应用

    比如自助设备也能通过运用二维码技术实现扫支付的功能,这是因为嵌入了条码识读引擎、二维码读头、二维码扫描模块等
    的头像 发表于 12-04 15:19 2445次阅读

    读取二维码扫描设备有哪些类型

    读取二维码扫描设备的几种类型中比较简单、常用的便是收银用条码扫描枪,因此它也被称为二维码设备/二维码读取设备/
    发表于 07-06 10:09 4065次阅读

    LV版本二维码生成及源码分享

    LV版本二维码生成及源码分享。
    发表于 04-11 15:06 0次下载

    ATKQR二维码识别

    ATKQR二维码识别库分享
    发表于 09-28 11:23 4次下载

    二维码扫描器,多样化场景应用

    随着互联网技术的发展,二维码扫描器早已不是一个新话题。二维码核心技术的创新应用,让身边的终端设备变得日趋智能,因为其核心技术——二维码识读引擎(以下简称“
    的头像 发表于 08-12 17:28 1088次阅读
    <b class='flag-5'>二维码</b><b class='flag-5'>扫描</b>器,多样化场景应用

    二维码读头有什么功能?如何选择二维码读头?

    二维码读头有什么功能?如何选择二维码读头?二维码读头可以将二维条码图像通过感光头读取、
    的头像 发表于 03-30 15:03 1800次阅读
    <b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>读头有什么功能?如何选择<b class='flag-5'>二维码</b>读头?

    如何选购到性价比更高的二维码识别扫描器?

    当今社会,越来越多的行业领域里都需要使用到二维码识别扫描器,比如应用在门禁安防领域的嵌入式二维码识读器用于读取手机中的门禁二维码或智慧门禁通
    的头像 发表于 07-04 15:27 885次阅读
    如何选购到性价比更高的<b class='flag-5'>二维码</b><b class='flag-5'>识别</b><b class='flag-5'>扫描</b>器?

    二维码扫描模块多少钱一台?二维扫描模组价格?

    服务设备如自动售卖、点餐机等内嵌式使用的嵌入式扫平台。在这个数字化时代,许多企业和集成商客户在自动识别技术领域中都会考虑采购二维码扫描模块,但是大家普遍关心的问题
    的头像 发表于 07-13 16:05 1151次阅读
    <b class='flag-5'>二维码</b><b class='flag-5'>扫描</b>模块多少钱一台?<b class='flag-5'>二维</b><b class='flag-5'>扫描</b>模组价格?

    各类自助机嵌入二维码模块,以实现一二维码扫描等功能

    当代科技的快速发展使得自助设备在各个领域中的应用愈发普遍,因为它带来了极大的便利性和效率提升,为我们的生活带来了巨大的改变。而在自助机的核心识别硬件中,二维码模块被广泛应用,配套了一
    的头像 发表于 07-19 15:51 1048次阅读
    各类自助机嵌入<b class='flag-5'>二维码</b>模块,以实现一<b class='flag-5'>维</b><b class='flag-5'>码</b>、<b class='flag-5'>二维码</b><b class='flag-5'>扫描</b>等功能

    远距离二维码扫描器如何选择?看看以下三款远距离二维码模块

    随着二维码相关技术及硬件的普及与低成本化,二维条码扫描设备的应用被人们广为熟知,应用的行业也众多。然而,在某些场景中,由于需要远距离扫描二维码
    的头像 发表于 03-21 15:41 669次阅读
    远距离<b class='flag-5'>二维码</b><b class='flag-5'>扫描</b>器如何选择?看看以下三款远距离<b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模块