最新业务开发二维码识别的功能,这个功能,在很多应用上都有,比如微信长按图片识别二维码,如果图片中存在可以识别的二维码时,可以增加一个选项 识别二维码。那么如何去实现这个功能呢。这里其实也非常简单,首先对图片进行二维码识别,识别结果返回的时候判断是否有二维码,有则增加识别二维码选项。

对于识别二维码,目前主流的就是zxing和zbar,对于这两者的选型,一般来说移动智能手机更多选择zxing,因为zxing更适合,zbar适合嵌入式硬件,两者对于QR图形码能力相差无几,但是zxing的资料明显更多一些。各位根据自己的情况进行调整。

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。
 在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集。
 每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

对于信息量越大的二维码图形点越多,多到一定程度识别就困难了,二维码有一定的纠错能力,但是不是万能的。

首先给出识别二维码的实现,二维码识别一组数据。

  1. /**
  2. * 对二维码图片解码结果进行编码
  3. *
  4. * @param str
  5. * @return
  6. */
  7. public static String recode(String str) {
  8. String formart = "";
  9.  
  10. try {
  11. boolean ISO = Charset.forName("ISO-8859-1").newEncoder()
  12. .canEncode(str);
  13. if (ISO) {
  14. formart = new String(str.getBytes("ISO-8859-1"), "UTF-8");
  15. } else {
  16. formart = str;
  17. }
  18. } catch (UnsupportedEncodingException e) {
  19. // TODO Auto-generated catch block
  20. e.printStackTrace();
  21. } catch (Exception e){
  22.  
  23. }
  24. return formart;
  25. }

其次,二维码生成的代码如下:

  1. public static Result handleQRCodeFormBitmap(Bitmap bitmap) {
  2.  
  3. Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class);
  4. hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
  5. hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
  6. hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE);
  7.  
  8. RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
  9. BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
  10. QRCodeReader reader2 = new QRCodeReader();
  11. Result result = null;
  12. try {
  13. result = reader2.decode(bitmap1, hints);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. if (source != null) {
  17. BinaryBitmap bitmap2 = new BinaryBitmap(new GlobalHistogramBinarizer(source));
  18. try {
  19. result = reader2.decode(bitmap2, hints);
  20. } catch (Exception e1) {
  21. e1.printStackTrace();
  22. }
  23. }
  24. }
  25. return result;
  26. }

对返回的result进行处理,如果未能识别,弹框中则无识别二维码选项。

而对于图片会有保存的功能,图片手进行进行命名,然后设定保存路径,创建好路径,最后将图片存入文件,根据需要是否需要进行压缩,可以设定相关参数。保存以后通知系统更新图片库。

保存图片的代码如下:

  1. public static void saveImageToGallery(Context context, Bitmap bmp) {
  2. String fileName = System.currentTimeMillis() + ".jpg";
  3. String filePath = FileUtils.getFilePath(context, "/pictures/qrcode/");
  4. // 首先保存图片
  5. File appDir = new File(filePath);
  6. if (!appDir.exists()) {
  7. appDir.mkdir();
  8. }
  9. File file = new File(appDir, fileName);
  10. try {
  11. FileOutputStream fos = new FileOutputStream(file);
  12. bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  13. fos.flush();
  14. fos.close();
  15. } catch (FileNotFoundException e) {
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. } catch (Exception e){
  20.  
  21. }
  22.  
  23. // 其次把文件插入到系统图库
  24. ContentValues values = new ContentValues();
  25. values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
  26. values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
  27. Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  28. // 最后通知图库更新
  29. context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
  30. }

到这里二维码识别和图片保存的功能就算基本完成了。

但是,经过实际的测试发现,这种方式只管功能,没有兼顾性能,进行多次操作导致内存使用增加30%,下一篇将描述分析过程和解决方法。

android 图片二维码识别和保存(一)的更多相关文章

  1. android 图片二维码识别和保存(二)

    续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M. 因此对功能进行研究,发现每次生成的图片没有即时的 ...

  2. python3+pyzbar+Image 进行图片二维码识别

    1.前言 最近公司有个项目要写个程序自动识别客户提交照片里的二维码,一接到这个任务马上就想到了用Python这个万能的工具! 2.搜寻 首先在网上到处找了很多“灵感”,看看其他人都会用什么包来完成这个 ...

  3. Android生成二维码--保存和分享二维码图片

    之前写过生成自定义二维码的两篇文章:<Android生成自定义二维码><Android生成二维码–拍照或从相册选取图片>,下面就介绍一下Android应用内如何保存以及分享二维 ...

  4. Atitit java 二维码识别 图片识别

    Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...

  5. Android二维码识别 开源项目ZXing的编译

    Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...

  6. C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别

    这两天撸了一个需求,通过 JS  调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ...

  7. 基于opencv3.0和下的条形码与二维码识别

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  8. 微信小程序二维码识别

    目前市场上二维码识别的软件或者网站越来越多,可是真正方便,无广告的却少之很少. 于是,自己突发奇想做了一个微信二维码识别的小程序. 包含功能: 1.识别二维码 ①普通二维码 ②条形码 ③只是复制解析出 ...

  9. 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列

    第47章     QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...

随机推荐

  1. 【金融123】ISDA协议

    http://blog.sina.com.cn/s/blog_799af92f0100ur03.html http://www.nafmii.org.cn/ NAFMII 官方文档 NAFMII_Ma ...

  2. php数组键值操作和数组统计函数-函数

    1.数组函数//作用:提供了很多官方写的很多有用的代码段,提高编写速度 1)数组的键值操作函数 array_values();//获取数组中的值 array_keys();//获取数组中的键 in_a ...

  3. Convolution1D与Convolution2D区别

    以下是Convolution1D的例子: # apply a convolution 1d of length 3 to a sequence with 10 timesteps, # with 64 ...

  4. 关于tomcat无法启动问题详解

    通常情况tomcat无法启动,有这么几个原因?(1)代码有问题; (2)tomcat有问题; (3)端口被占; (4)动态web项目为3.0: (5)java环境运行内存不足; 这是比较常见的问题.解 ...

  5. Python自动化之Django中间件

    django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...

  6. 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 ...

  7. Navicat Premium 12 激活

    链接:https://pan.baidu.com/s/1R4WB2JjKd0UYnN00CpUPSA 提取码:e3wy (破解工具及软件安装包) 破解流程:https://www.jianshu.co ...

  8. vue中使用swiper并自定义分页器样式

    一,安装swiper 执行命令 npm install vue-awesome-swiper --save 二,引入swiper import {Swiper} from "vue-awes ...

  9. vrrp_script不起作用解决方案

    我这里主要是因为windows转码造成的:将可执行的check_nginx.sh检测脚本内容复制到U盘,然后插入内网windows,将内容用nodepad++打开,复制,粘贴到服务器的check_ng ...

  10. PHP程序员学Objective-C之后的变化

    趣味坎谈,不一定100%准确,以自己的实际情况为准; 如题,我2008年开始学PHP,PHP是我学的第二门编程语言,一直用到现在,2010年初开始做iOS开发,学习了Objective-C,学这2门语 ...