Camera是什么

Camera官方说明The Camera class is used toset image capture settings, start/stop preview, snap pictures, and retrieveframes for encoding for video. This class is a client for the Camera service,which manages the actual camera hardware.

大概意思是Camera是一个用来设置图片获取选项,开启/关闭预览,连续拍照,获取视频解码每一帧,对于管理实际摄像硬件的Camer service来说它相当于一个客户端。

Camera应用场景

项目开发中经常会遇到拍照或录像的需求,有两种实现方式一种是调用系统相机,另一种是使用系统Camera类和surfaceView来实现自定义Camera。

Camera使用

1 Menifest添加权限

<!--允许使用相机-->
<uses-permission android:name="android.permission.CAMERA"/>
<!--允许使用外部存储-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--允许使用闪光灯-->
<uses-permission android:name="android.permission.FLASHLIGHT"/><!--使用相机特性-->
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>

2.打开相机

判断是否有相机

/*** check if the device has a camera* @return*/
private boolean checkCameraHardWare() {if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {return true;}return false;
}

调用Camera的open方法获取实例

/**
 * a safe way to get an instance ofCamera Object
 * @return
 
*/
private CameragetCameraInst() {
    Camera cameraInst = null;
    try {
        cameraInst = cameraInst.open();
    } catch(Exception e) {
        e.printStackTrace();
    }
    returncameraInst;
}

3.初始化

a 设置拍摄角度

b 设置相机参数,预览大小,闪光灯开关,缩放比例。

c 设置预览要使用的surfaceholder

d 打开预览

Camera.Parameters parameters = mCamera.getParameters();
// ......设置Camera参数
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();

4 使用相机

获取图片

a.  调用takePictrue,会触发一个异步的图片获取,以及多个回调。此方法会导致预览关闭,若想继续预览在获取图片后再次调用startPreview
参数说明
shutter call back 当图片被获取到的时候会被回调,可以用来播放一个声音让用户知道图片已经被获取到。
PictureCallBack raw 当图片的原始数据可用时会被回调
PictureCallBack postView 当发生缩放时会被回调,并不是所有设备都支持。
PictureCallBack jpeg 当被压缩的图片可用时,会被回调
mCameraInstance.takePicture(null, null, new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// 在这里处理获取到的图片,data可直接转化为bitmap或图片文件}
});

b另外获取视频的示例这里暂时不做过多介绍,可参考官方文档https://developer.android.com/guide/topics/media/camera.html

5关闭预览,释放相机资源。

注意

a。注意:一定要设置预览大小,否则图片会变形。设置预览尺寸,首先获取设备支持的预览尺寸列表,找到与屏幕分辨率差值最小的并设置。

List<Camera.Size>supportedPreviewSizes = parameters.getSupportedPreviewSizes();
WindowManager windowManager =(WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
int screenW = windowManager.getDefaultDisplay().getWidth();
int screenH =windowManager.getDefaultDisplay().getHeight();
Log.d("hezd","supportscreen size:width="+screenW+",height="+screenH);
int diff = Integer.MAX_VALUE;
Camera.Size beseSize = null;
for(Camera.Size size : supportedPreviewSizes){
    Log.d("hezd","supportsize:width="+size.width+",height="+size.height);
    int height= Math.abs(screenH-size.height);
    int width= Math.abs(size.width-screenW);
    int currentDiff= width+height;
    if(currentDiff==0||currentDiff<diff){
        beseSize = size;
        diff= currentDiff;
    }
}
if(beseSize!=null) {
    parameters.setPreviewSize(beseSize.width,beseSize.height);
}

B 要截取的预览区域非全屏的情况获取图片

这种情况还是比较麻烦的,如果直接使用扫描框的坐标去截取获取的图片是不正确,因为这时获取的图片是尺寸不一定是当前扫描框父窗体的的尺寸。我在这里的解决办法是先将图片缩小到同当前父窗体相同尺寸,在根据扫描框坐标去截取。

Matrix matrix = new Matrix();
matrix.postRotate(90);
matrix.postScale(difW,difH);
Bitmap rotateBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix,true);
if(bitmap!=null){
    bitmap.recycle();
}

ByteArrayOutputStream bos = new ByteArrayOutputStream();
rotateBitmap.compress(Bitmap.CompressFormat.JPEG,100,bos);
try {
    BitmapRegionDecoder regionDecoder =BitmapRegionDecoder.newInstance(bos.toByteArray(),0,bos.toByteArray().length,false);
    Rectrect = new Rect(mScaLeft,mScanTop,mScanWidth,mScanHeight);
    BitmapregionBitmap = regionDecoder.decodeRegion(rect, options);
    mShowPicIv.setVisibility(View.VISIBLE);
    mShowPicIv.setImageBitmap(rotateBitmap);
    mPicIv.setImageBitmap(regionBitmap);
} catch(IOException e) {
    e.printStackTrace();
}

另外还想到一个办法,没有尝试,有兴趣的同学可以尝试一下,就是去设置相机图片尺寸,然后再去截取。

身份证扫描

在应用中需要对身份证扫描获取信息的场景很多,参考很多ocr相关资料和项目后,编写了一个示例工程,在文章最后附上地址。

代码下载

身份证扫描项目地址

Camera详解(附身份证扫描示例)相关推荐

  1. 蓝牙:CRC原理详解(附crc16校验代码)

    CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...

  2. php中的装饰,详解PHP装饰模式的示例代码

    详解PHP装饰模式的示例代码<?php // 装饰模式 function echoLine($msg) { echo $msg, ' '; } class RequestHelper { /** ...

  3. 《前端》权限链接--vue前端权限控制方案详解附demo_feiyu_may的博客-CSDN博客_vue 前端权限

    前端权限控制 - 潘正 - 博客园  https://www.cnblogs.com/guchengnan/p/11800947.html vue前端权限控制方案详解附demo_feiyu_may的博 ...

  4. PackageManagerService启动详解(七)之扫描系统应用安装目录阶段流程分析

    PKMS启动详解(七)之BOOT_PROGRESS_PMS_SYSTEM_SCAN_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系 ...

  5. Win+TexLive2020+TexStudio安装过程详解附ElsevierLatex模板下载并使用

    Win+TexLive2020+TexStudio安装过程详解附ElsevierLatex模板下载并使用 一.下载并安装Texlive2020 1.下载TexLive2020 2.安装过程 解压之后运 ...

  6. 计算机排名的985大学排名,2019年985大学名单排名,985大学详解(附全榜单)

    中国最有名的就是211大学和985大学了.2019年211大学名单排名已经为大家公布了,相比之下985大学更加少,全国只有39所985大学,可见985是比211更加有含金量的学校了.下面排行榜123网 ...

  7. .user.ini上传详解附CTF例题

    .user.ini上传详解附CTF例题 题目 解法 https://buuoj.cn/challenges#[SUCTF%202019]CheckIn [SUCTF 2019]CheckIn 题目 解 ...

  8. 数学规划详解(附例题及部分Python实现)

    数学规划详解(附例题及Python实现) 例题来自于清风老师的数学建模课,个人认为讲的非常好,欢迎大家购买 一.概述 1.1 定义 数学规划是运筹学的一个分支,在约束条件下,按照目标函数来寻求计划管理 ...

  9. python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)

    之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...

最新文章

  1. 总结 | 机器学习的通俗讲解!
  2. 批归一化和Dropout不能共存?这篇研究说可以
  3. Zookeeper知识点详解
  4. IIS7开启gZip动态压缩
  5. java学习(119):set类
  6. python模型的属性是什么_python – Django:为什么Django模型字段的类属性?
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的体育竞赛比赛赛事管理系统
  8. Web Audio API 入门1
  9. Python 之面向对象 继承
  10. 如何更改gnome-screenshot的默认的保存路径?
  11. Linux如何查找软件的安装位置
  12. 色彩搭配原则和方法【转】
  13. spring的依赖注入是什么意思
  14. unity 引用 移动mm 支付sdk
  15. 树莓派配置文件 config.txt - HDMI 热插拔
  16. 亚马逊多账号怎么管理|亚马逊账号关联
  17. 百度地图JS API 支持HTTPS
  18. 人员行为识别系统 TensorFlow
  19. 【算法】0-1背包问题(Knapsack problem)
  20. 抖音seo搜索是什么?源码部署-seo排名系统源码分析

热门文章

  1. 计算机硬件与系统软件
  2. 2022年宜昌市高新技术企业申报奖励政策以及认定条件要求汇总!
  3. 融云一站式「云市场」上线,携手生态伙伴,共建价值平台
  4. 每日一问-ChapGPT-20221231-关于中医的各国看法
  5. 参考文献怎么查找,去哪里查找?一篇文章讲明白这些问题
  6. 非北京户口,户口地买房提取公积金
  7. 虾皮shopee蓝海词怎么找?挖掘shopee蓝海词有哪些技巧?
  8. 18张儿童插画让你秒懂Kubernetes
  9. 《学雷锋日-志愿者服务行动》
  10. 对计算机学院建设性意见,计通学院云平台优质课程建设实施意见