热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

AndroidCamera实现毫秒级拍照实例

本篇文章主要介绍了AndroidCamera实现毫秒级拍照实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

我们知道自定义Camera需要以下几步

  1. 打开相机,即实例化Camera对象,Camera camera = Camera.open();
  2. 设置Camera的相关参数,Camera.Parameters parameters = camera.getParameters();
  3. 打开预览,camera.setPreviewDisplay(surfaceholder); camera.startPreview();
  4. 获取图片,这里只是从预览中获取因此使用,camera.setPreviewCallback(new Camera.PreviewCallback(){……..});
  5. 停止预览,释放相机,camera.stopPreview();camera.release();

1、打开相机

public static Camera openFacingBackCamera() {
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    for (int camIdx = 0, cameraCount = Camera.getNumberOfCameras(); camIdx 

2、设置相关参数和预览

//定义SurfaceView
private SurfaceView localSurface;
 // 为surfaceHolder添加一个回调监听器
    localSurface.getHolder().addCallback(new SurfaceHolder.Callback() {
      @Override
      public void surfaceCreated(SurfaceHolder holder) {

      }

      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera = CameraUtil.openFacingBackCamera();
        //设置相机预览旋转角度
        camera.setDisplayOrientation(180);
        if (camera != null) {
          Camera.Parameters parameters = camera.getParameters();// 获得相机参数
          List sizes = parameters.getSupportedPreviewSizes();
          List sizes_pic = parameters.getSupportedPictureSizes();
          Camera.Size cs = sizes.get(0);
          int mWidth = cs.width;
          int mHeight = cs.height;
          parameters.setPreviewSize(mWidth, mHeight);
          parameters.setPictureSize(sizes_pic.get(0).width, sizes_pic.get(0).height);
          parameters.setJpegQuality(85);//
          parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
          parameters.setPictureFormat(ImageFormat.JPEG);
          camera.setParameters(parameters);
          try {
            camera.setPreviewDisplay(localSurface.getHolder());
            camera.startPreview(); // 开始预览
            camera.autoFocus(null); // 自动对焦
          } catch (IOException e) {
            e.printStackTrace();
            camera.stopPreview();
            camera.release();
            camera = null;
          }
        }
      }

      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
        if (camera!=null){
          camera.stopPreview();
          camera.release();
          camera = null;
        }
      }
    } );
    // 设置该SurfaceView自己不维护缓冲
    localSurface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

3、获取图片

 private void getViewImage() {
   //设置监听
    camera.setPreviewCallback(new Camera.PreviewCallback(){

      @Override
      public void onPreviewFrame(byte[] data, Camera camera) {
        Camera.Size size = camera.getParameters().getPreviewSize();
        try{
          YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
          if(image!=null){
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);
            Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());
            //因为图片会放生旋转,因此要对图片进行旋转到和手机在一个方向上
            rotateBitmap(bmp);
            stream.close();
          }
        }catch(Exception ex){
          Log.e("Sys","Error:"+ex.getMessage());
        }
      }
    });
  }

旋转图片的方法

public void rotateMyBitmap(Bitmap bmp){
    Matrix matrix = new Matrix();
    matrix.postScale(-1, 1); // 镜像水平翻转(如果左右颠倒)
    matrix.postRotate(180);
    Bitmap nbmp = Bitmap.createBitmap(bmp, 0,0, bmp.getWidth(), bmp.getHeight(), matrix, true);
    imageView.setImageBitmap(nbmp);
  };

自定义时间拍照

  private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
      switch (msg.what) {
        case 101:
          getViewImage();
          Log.e(TAG, "handleMessage: 拍照" );
          mHandler.sendEmptyMessageDelayed(102, 100);
          break;
        case 102:
          camera.setPreviewCallback(null);
          break ;
      }
    }
  };

然后点击按钮调用

mHandler.sendEmptyMessageDelayed(101, 100);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文详细介绍了Vim编辑器的三种主要模式及其常用命令,帮助用户更好地掌握这一强大的文本编辑工具。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 在Fedora 31上部署PostgreSQL 12
    本文详细介绍如何在Fedora 31操作系统上安装和配置PostgreSQL 12数据库。包括环境准备、安装步骤、配置优化以及安全设置,确保数据库能够稳定运行并提供高效的性能。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文介绍了在MacOS上通过Homebrew安装Anaconda3,并配置环境变量以实现不同Python版本之间的快速切换。同时,提供了详细的步骤来创建和管理多个Python环境。 ... [详细]
  • 请看|间隔时间_Postgresql 主从复制 ... [详细]
  • NFS(Network File System)即网络文件系统,是一种分布式文件系统协议,主要用于Unix和类Unix系统之间的文件共享。本文详细介绍NFS的配置文件/etc/exports和相关服务配置,帮助读者理解如何在Linux环境中配置NFS客户端。 ... [详细]
  • 本文介绍如何在Linux系统中卸载预装的OpenJDK,安装指定版本的JDK 1.8,并配置防火墙以确保系统安全性和软件兼容性。 ... [详细]
  • 本文详细介绍了 Kubernetes 集群管理工具 kubectl 的基本使用方法,涵盖了一系列常用的命令及其应用场景,旨在帮助初学者快速掌握 kubectl 的基本操作。 ... [详细]
author-avatar
陈应锋forever
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有