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%,下一篇将描述分析过程和解决方法。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android Studio gradle编译 NullPointerException(no error message)解决
原文: Android Studio gradle编译 NullPointerException(no error message)解决 1.关闭Android Studio 2.找到工程目录下的 .gradle 文件夹,删除 3.重新启动Android Studio 即可
-
下一篇
android 图片二维码识别和保存(二)
续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M。 因此对功能进行研究,发现每次生成的图片没有即时的释放,导致内存中的图片不断累积,内存占用不断攀升。因此,需要对图片进行释放,释放的时候需要特别关注的地方有: 1.释放注意图片的状态。 2.注意异常的捕获。 下面就是图片释放的有关代码。 /** * 回收bitmap */ public static void recycleBitmap(Bitmap bitmap ) { if(bitmap != null && !bitmap.isRecycled()){ bitmap.recycle(); bitmap = null; } } 对于异常的捕获主要是需要关注图片在进行encode和decode过程中的处理,原来的方法应该改为如下: public static Result handleQRCodeFormBitmap(Bitmap bitmap) { Map<DecodeHintType, Object> h...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- MySQL数据库在高并发下的优化方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器