android 图片二维码识别和保存(一)
最新业务开发二维码识别的功能,这个功能,在很多应用上都有,比如微信长按图片识别二维码,如果图片中存在可以识别的二维码时,可以增加一个选项 识别二维码。那么如何去实现这个功能呢。这里其实也非常简单,首先对图片进行二维码识别,识别结果返回的时候判断是否有二维码,有则增加识别二维码选项。
对于识别二维码,目前主流的就是zxing和zbar,对于这两者的选型,一般来说移动智能手机更多选择zxing,因为zxing更适合,zbar适合嵌入式硬件,两者对于QR图形码能力相差无几,但是zxing的资料明显更多一些。各位根据自己的情况进行调整。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。
在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集。
每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
对于信息量越大的二维码图形点越多,多到一定程度识别就困难了,二维码有一定的纠错能力,但是不是万能的。
首先给出识别二维码的实现,二维码识别一组数据。
- /**
- * 对二维码图片解码结果进行编码
- *
- * @param str
- * @return
- */
- public static String recode(String str) {
- String formart = "";
- try {
- boolean ISO = Charset.forName("ISO-8859-1").newEncoder()
- .canEncode(str);
- if (ISO) {
- formart = new String(str.getBytes("ISO-8859-1"), "UTF-8");
- } else {
- formart = str;
- }
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (Exception e){
- }
- return formart;
- }
其次,二维码生成的代码如下:
- public static Result handleQRCodeFormBitmap(Bitmap bitmap) {
- Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
- hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
- hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
- hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
- RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
- BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
- QRCodeReader reader2 = new QRCodeReader();
- Result result = null;
- try {
- result = reader2.decode(bitmap1, hints);
- } catch (Exception e) {
- e.printStackTrace();
- if (source != null) {
- BinaryBitmap bitmap2 = new BinaryBitmap(new GlobalHistogramBinarizer(source));
- try {
- result = reader2.decode(bitmap2, hints);
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- }
- }
- return result;
- }
对返回的result进行处理,如果未能识别,弹框中则无识别二维码选项。
而对于图片会有保存的功能,图片手进行进行命名,然后设定保存路径,创建好路径,最后将图片存入文件,根据需要是否需要进行压缩,可以设定相关参数。保存以后通知系统更新图片库。
保存图片的代码如下:
- public static void saveImageToGallery(Context context, Bitmap bmp) {
- String fileName = System.currentTimeMillis() + ".jpg";
- String filePath = FileUtils.getFilePath(context, "/pictures/qrcode/");
- // 首先保存图片
- File appDir = new File(filePath);
- if (!appDir.exists()) {
- appDir.mkdir();
- }
- File file = new File(appDir, fileName);
- try {
- FileOutputStream fos = new FileOutputStream(file);
- bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
- fos.flush();
- fos.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e){
- }
- // 其次把文件插入到系统图库
- ContentValues values = new ContentValues();
- values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
- values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
- Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
- // 最后通知图库更新
- context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
- }
到这里二维码识别和图片保存的功能就算基本完成了。
但是,经过实际的测试发现,这种方式只管功能,没有兼顾性能,进行多次操作导致内存使用增加30%,下一篇将描述分析过程和解决方法。
android 图片二维码识别和保存(一)的更多相关文章
- android 图片二维码识别和保存(二)
续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M. 因此对功能进行研究,发现每次生成的图片没有即时的 ...
- python3+pyzbar+Image 进行图片二维码识别
1.前言 最近公司有个项目要写个程序自动识别客户提交照片里的二维码,一接到这个任务马上就想到了用Python这个万能的工具! 2.搜寻 首先在网上到处找了很多“灵感”,看看其他人都会用什么包来完成这个 ...
- Android生成二维码--保存和分享二维码图片
之前写过生成自定义二维码的两篇文章:<Android生成自定义二维码><Android生成二维码–拍照或从相册选取图片>,下面就介绍一下Android应用内如何保存以及分享二维 ...
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
- Android二维码识别 开源项目ZXing的编译
Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...
- C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别
这两天撸了一个需求,通过 JS 调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ...
- 基于opencv3.0和下的条形码与二维码识别
其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...
- 微信小程序二维码识别
目前市场上二维码识别的软件或者网站越来越多,可是真正方便,无广告的却少之很少. 于是,自己突发奇想做了一个微信二维码识别的小程序. 包含功能: 1.识别二维码 ①普通二维码 ②条形码 ③只是复制解析出 ...
- 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列
第47章 QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...
随机推荐
- 【金融123】ISDA协议
http://blog.sina.com.cn/s/blog_799af92f0100ur03.html http://www.nafmii.org.cn/ NAFMII 官方文档 NAFMII_Ma ...
- php数组键值操作和数组统计函数-函数
1.数组函数//作用:提供了很多官方写的很多有用的代码段,提高编写速度 1)数组的键值操作函数 array_values();//获取数组中的值 array_keys();//获取数组中的键 in_a ...
- Convolution1D与Convolution2D区别
以下是Convolution1D的例子: # apply a convolution 1d of length 3 to a sequence with 10 timesteps, # with 64 ...
- 关于tomcat无法启动问题详解
通常情况tomcat无法启动,有这么几个原因?(1)代码有问题; (2)tomcat有问题; (3)端口被占; (4)动态web项目为3.0: (5)java环境运行内存不足; 这是比较常见的问题.解 ...
- Python自动化之Django中间件
django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...
- Field userService in com.wuji.controller.UserController required a bean of type 'com.wuji.service.UserService' that could not be found
Field userService in com.wuji.controller.UserController required a bean of type 'com.wuji.service.Us ...
- Navicat Premium 12 激活
链接:https://pan.baidu.com/s/1R4WB2JjKd0UYnN00CpUPSA 提取码:e3wy (破解工具及软件安装包) 破解流程:https://www.jianshu.co ...
- vue中使用swiper并自定义分页器样式
一,安装swiper 执行命令 npm install vue-awesome-swiper --save 二,引入swiper import {Swiper} from "vue-awes ...
- vrrp_script不起作用解决方案
我这里主要是因为windows转码造成的:将可执行的check_nginx.sh检测脚本内容复制到U盘,然后插入内网windows,将内容用nodepad++打开,复制,粘贴到服务器的check_ng ...
- PHP程序员学Objective-C之后的变化
趣味坎谈,不一定100%准确,以自己的实际情况为准; 如题,我2008年开始学PHP,PHP是我学的第二门编程语言,一直用到现在,2010年初开始做iOS开发,学习了Objective-C,学这2门语 ...