Android高仿微信/支付宝 扫一扫(弱光检测扫一扫自动放大功能)
原文地址
前言
效果图走一波(用的gif大师,录制的质量比较低,质量过高的传不上去,见谅)
![](/assets/blank.gif)
需求分析
代码实现
弱光检测
/*** Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,* reuse the same reader objects from one decode to the next.** @param data The YUV preview frame.* @param width The width of the preview frame.* @param height The height of the preview frame.*/private void decode(byte[] data, int width, int height)
private int[] decodeYUV420SP(byte[] yuv420sp, int width, int height) {final int frameSize = width * height;int rgb[] = new int[width * height];for (int j = 0, yp = 0; j < height; j++) {int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;for (int i = 0; i < width; i++, yp++) {int y = (0xff & ((int) yuv420sp[yp])) - 16;if (y < 0) y = 0;if ((i & 1) == 0) {v = (0xff & yuv420sp[uvp++]) - 128;u = (0xff & yuv420sp[uvp++]) - 128;}int y1192 = 1192 * y;int r = (y1192 + 1634 * v);int g = (y1192 - 833 * v - 400 * u);int b = (y1192 + 2066 * u);if (r < 0) r = 0;else if (r > 262143) r = 262143;if (g < 0) g = 0;else if (g > 262143) g = 262143;if (b < 0) b = 0;else if (b > 262143) b = 262143;rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) &0xff00) | ((b >> 10) & 0xff);}}return rgb;}
private int getAverageColor(Bitmap bitmap) {int redBucket = 0;int greenBucket = 0;int blueBucket = 0;int pixelCount = 0;for (int y = 0; y < bitmap.getHeight(); y++) {for (int x = 0; x < bitmap.getWidth(); x++) {int c = bitmap.getPixel(x, y);pixelCount++;redBucket += Color.red(c);greenBucket += Color.green(c);blueBucket += Color.blue(c);}}int averageColor = Color.rgb(redBucket / pixelCount, greenBucket/ pixelCount, blueBucket / pixelCount);return averageColor;}
private void analysisBitmapColor(byte[] data, int width, int height) {int[] rgb = decodeYUV420SP(data, width, height);Bitmap bmp = null;if (null != frameRect) {//取矩形扫描框frameRect的2分之一创建为bitmap来分析bmp = Bitmap.createBitmap(rgb, frameRect.left + (frameRect.right - frameRect.left) / 4, frameRect.width() / 2, frameRect.width() / 2, frameRect.height() / 2, Bitmap.Config.ARGB_4444);}if (bmp != null) {float color = getAverageColor(bmp);DecimalFormat decimalFormat1 = new DecimalFormat("0.00");String percent = decimalFormat1.format(color / -16777216);float floatPercent = Float.parseFloat(percent);Log.e(TAG, " color= " + color + " floatPercent= " + floatPercent + " bmp width= " + bmp.getWidth() + " bmp height= " + bmp.getHeight());Constants.isWeakLight = (color == -16777216 || (floatPercent >= 0.95 && floatPercent <= 1.00));bmp.recycle();}}
上述代码基本实现了弱光的检测,代码还可以进行优化,比如我在YUV转换为AGB时,我只转换矩形扫描框内的图片,只分析这块的图片AGB平均值,目前,这一帧的图片我全部转换了AGB,你会发现,color 永远不会等于-16777216(black),因为最优的做法就是只decode矩形扫描框内的图片将其转换为agb数组,然后再进行图片的agb分析,这样也仅仅有可能color会等于-16777216.
扫一扫自动放大的功能
if (rawResult != null) {// Don't log the barcode contents for security.long end = System.currentTimeMillis();Log.d(TAG, "Found barcode in " + (end - start) + " ms");if (handler != null) {float point1X = rawResult.getResultPoints()[0].getX();float point1Y = rawResult.getResultPoints()[0].getY();float point2X = rawResult.getResultPoints()[1].getX();float point2Y = rawResult.getResultPoints()[1].getY();int len = (int) Math.sqrt(Math.abs(point1X - point2X) * Math.abs(point1X - point2X) + Math.abs(point1Y - point2Y) * Math.abs(point1Y - point2Y));if (frameRect != null) {int frameWidth = frameRect.right - frameRect.left;Camera camera = activity.getCameraManager().getCameraNotStatic();Camera.Parameters parameters = camera.getParameters();final int maxZoom = parameters.getMaxZoom();int zoom = parameters.getZoom();if (parameters.isZoomSupported()) {if (len <= frameWidth / 4) {if (zoom == 0) {zoom = maxZoom / 3;} else {zoom = zoom + 10;}if (zoom > maxZoom) {zoom = maxZoom;}parameters.setZoom(zoom);camera.setParameters(parameters);final Result finalRawResult = rawResult;postDelayed(new Runnable() {@Overridepublic void run() {Message message = Message.obtain(handler, R.id.decode_succeeded, finalRawResult);Bundle bundle = new Bundle();bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());message.setData(bundle);message.sendToTarget();}}, 1000);} else {Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult);Bundle bundle = new Bundle();bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());message.setData(bundle);message.sendToTarget();}}} else {Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult);Bundle bundle = new Bundle();bundle.putParcelable(DecodeThread.BARCODE_BITMAP, source.renderCroppedGreyscaleBitmap());message.setData(bundle);message.sendToTarget();}}} else {if (handler != null) {Message message = Message.obtain(handler, R.id.decode_failed);message.sendToTarget();
// if (!Constants.isWeakLight) {
// long failedTimeStamp = System.currentTimeMillis();
// if (failedTimeStamp - intervalTime > INTERVAL) {
// isResetTime = true;
// intervalTime = System.currentTimeMillis();
// Camera camera = activity.getCameraManager().getCameraNotStatic();
// Camera.Parameters parameters = camera.getParameters();
// final int maxZoom = parameters.getMaxZoom();
// int zoom = parameters.getZoom();
// if (parameters.isZoomSupported()) {
// if (zoom == 0) {
// zoom = maxZoom / 2;
// } else {
// zoom = zoom + 10;
// }
// if (zoom > maxZoom) {
// zoom = maxZoom;
// }
// parameters.setZoom(zoom);
// camera.setParameters(parameters);
// }
// }
// }}}
Android高仿微信/支付宝 扫一扫(弱光检测扫一扫自动放大功能)相关推荐
- android+高仿视频录制,android高仿微信视频编辑页
android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...
- php支付密码控件,Android高仿微信支付密码输入控件实例代码
这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...
- android高仿微信视频编辑页-视频多张图片提取
android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...
- android仿微信聊天功能,Android高仿微信聊天界面代码分享
微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们 ...
- android 微信高仿,Android高仿微信聊天界面代码分享
微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们 ...
- android com.mylhyl,Android 高仿微信朋友圈拍照上传功能
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...
- android高仿微信聊天页面,Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)
目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果. 先看下效果图: 仔细观察上图,我们可以发现,背景图以用户头像为模板,对其进行了高 ...
- android仿微信充值布局,Android 高仿微信支付数字键盘功能
现在很多app的支付.输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便.其效果着实精致. 下面带着大家学习下,如何高仿微信的数字键盘,可以拿来直接用在自身的项目中. 先看下效果图: 1. 自定 ...
- android 微信高仿,Android 高仿微信朋友圈拍照上传功能
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...
最新文章
- 用Python和项目进行机器学习(初学者) Machine Learning A-Z with Python with Project (Beginner)
- sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
- 网页游戏架设_这10年来手机游戏的迭代,也是一部硬件发展史丨触乐
- jQuery快速复习
- oracle的共享内存段,oracle共享内存段手工清理
- 粗钢行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 【SRM-07 D】天才麻将少女KPM
- 双系统win+ubuntu14.04使用360随身wifi 3代
- 元胞自动机与疏散模型的matlab算法,元胞自动机模拟多出口疏散模型的matlab实现...
- 外省市机动车驾驶证换领本市机动车驾驶证
- LibPcap丢包问题
- 如何在Ubuntu 20.04上使用Seafile同步和共享文件
- recyclerView的滑动
- HDU - 5894 hannnnah_j’s Biological Test 组合数(插板法)
- C++ 数学与算法系列之高斯消元法求解线性方程组
- 存在的hive插入数据_往hive表中插入数据以及导出数据
- 币小秘:这些年,见过的带单老师们,这里有没有你踩过的坑?
- 阿里云神龙团队拿下 TPCx-BB 排名第一的背后技术
- Storyboard 解析
- 基于javascripts的语法特性使用设计原则
热门文章
- HDU 小明系列故事——师兄帮帮忙
- Java--获取属性(System.getProperty)--方法/实例
- struts2的拦截器AbstractInterceptor
- 《Adobe Illustrator CS6中文版经典教程(彩色版)》—第0课0.18节使用透视
- 一个可以使用自己语料进行训练的聊天机器人开源项目
- BCGControlBar入门
- setup factory 创建多个快捷方式_vue3.0创建项目及API讲解(一)
- 腾讯回应考生喊话马化腾;库克承认在使用 ChatGPT;OpenHarmony 4.0 Beta1 发布 | 极客头条
- win7自带硬盘分区工具
- 哪些牌子的蓝牙耳机性价比高?国内性价比高的蓝牙耳机推荐