拍照_拍照识别 - CSDN
精华内容
参与话题
  • Android 7.0调用相机拍照,返回后显示拍照照片

    万次阅读 多人点赞 2017-11-29 08:33:02
    Android 7.0调用相机拍照,返回后显示拍照照片,并显示到手机相册中
    在7.0以前,调用相机拍照时一般如下
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
            + "/test/" + System.currentTimeMillis() + ".jpg");
    file.getParentFile().mkdirs();
    
    Uri uri = Uri.fromFile(file);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    在用Android 7.0版本时,出现了异常 FileUriExposedException,就是在传递uri时出错
    百度了一下,说是Android 7.0后又修改了文件权限,可以使用FileProvider解决
    1.在 res 目录下新建文件夹 xml 然后创建资源文件 filepaths(随意名字)
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <external-path
            name="images"
            path="test/"/>
    </resources>
    其中
    <files-path/> //代表的根目录: Context.getFilesDir()
    <external-path/> //代表的根目录: Environment.getExternalStorageDirectory()
    <cache-path/> //代表的根目录: getCacheDir()
    2.在manifest中添加provider
    <application
       
       ......
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.xykj.customview.fileprovider" 
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths"/>
        </provider>
    </application>
    3.在java代码中
    /**
     * 使用相机
     */
    private void useCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
                + "/test/" + System.currentTimeMillis() + ".jpg");
        file.getParentFile().mkdirs();
        
        //改变Uri  com.xykj.customview.fileprovider注意和xml中的一致
        Uri uri = FileProvider.getUriForFile(this, "com.xykj.customview.fileprovider", file);
        //添加权限
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, REQUEST_CAMERA);
    }
    调用相机拍照,图片得存储吧,存储图片又需要权限,因此动态申请权限
    AndroidManifest.xml文件中
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    java代码中
    public void applyWritePermission() {
    
        String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
    
        if (Build.VERSION.SDK_INT >= 23) {
            int check = ContextCompat.checkSelfPermission(this, permissions[0]);
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝
            if (check == PackageManager.PERMISSION_GRANTED) {
                //调用相机
                useCamera();
            } else {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            }
        } else {
            useCamera();
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            useCamera();
        } else {
            // 没有获取 到权限,从新请求,或者关闭app
            Toast.makeText(this, "需要存储权限", Toast.LENGTH_SHORT).show();
        }
    }
    然后在ImageView点击事件中调用applyWritePermission()方法 并在onActivityResult中编写显示图片的代码
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == RESULT_OK) {
            Log.e("TAG", "---------" + FileProvider.getUriForFile(this, "com.xykj.customview.fileprovider", file));
            imageView.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath()));
        }
    }
    完成,看下FileProvider.getUriFile方法得到的Uri结果
    content://com.xykj.customview.fileprovider/images/1494663973508.jpg
    可以发现 name为临时的文件夹名 path为自己定义路径的文件夹名
    <resources>
        <external-path name="images" path="test/"/>
    </resources>
    4.最后发现此方法相机拍照的图片并没有显示在手机图库中
    想要在手机相册图库中显示刚拍照的图片可以采用发送广播的方式
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == RESULT_OK) {
            headImageView.setImageURI(Uri.fromFile(file));
    
            //在手机相册中显示刚拍摄的图片
            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            Uri contentUri = Uri.fromFile(file);
            mediaScanIntent.setData(contentUri);
            sendBroadcast(mediaScanIntent);
        }
    }

    展开全文
  • win7打开摄像头照相拍照软件

    热门讨论 2020-07-30 23:33:30
    win7打开摄像头照相拍照软件,漂亮的很,,
  • web 实现在线拍照。。

    2013-08-09 15:16:58
    综合了几款拍照插件:   1: scriptCam 需要的flash的版本比较高 Adobe Flash Player 11.7 。 2:CamCanvas 本质也是通过flash实现的,只是利用了html5的画布。。 3: nimbb提供的是摄像的功能。另外,用过的...

    综合了几款拍照插件:

     

    1:  scriptCam  需要的flash的版本比较高 Adobe Flash Player 11.7 。

    2:CamCanvas  本质也是通过flash实现的,只是利用了html5的画布。。

    3: nimbb提供的是摄像的功能。另外,用过的过程中需要key,对于这么小的功能,用key没必要。

    4:   webcam插件,实现简单,同时对html的版本没限制,直接调用系统的get_movie方法进行拍照,然后通过数据流返回,通过后台对数据流进行图片合成。。

     

     

    现在的项目中实现用的是webcam ,实现了在不同平台的拍照功能。 ios ,andriod ,pc ...

     

    总结经验如下:   

      1: 在PC端实现的话,需要调用插件。。 而在andriod ,IOS的时候,但点击上传的时候,系统会自动调用拍照组件,不需要调用插件。。 

     2:andriod 和PC端可以实现同时上传多张图片和拍照功能共存。 即如下实现:

          <input type='file'  multiple  > 

        但是IOS6,只能只能支持上传一张一张图片和拍摘功能共存,即: <input type='file'   >  ,不能用 multiple 属性。

     

    3:IOS5根本就不支持浏览器上传图片,跟不用说调用拍照功能了。

    4:Ie6 只支持一次性上传一张图片。。

     

     

     

     

     

     

     

     

    展开全文
  • 拍照功能和选取本地图片使用的是HTML5的API 实现。 我为测试这个功能使用node写了个本地服务器,对于手机调试,可以通过连接同一个无线网访问对应的地址进行测试。 选取本地图片 gallery Gallery模块管理系统相册...

    基于Vue和uni-app实现手机app的功能实现和打包。拍照功能和选取本地图片使用的是HTML5的API 实现。

    我为测试这个功能使用node写了个本地服务器,对于手机调试,可以通过连接同一个无线网访问对应的地址进行测试。

    选取本地图片

    gallery

    Gallery模块管理系统相册,支持从相册中选择图片或视频文件、保存图片或视频文件到相册等功能。通过plus.gallery获取相册管理对象。

    gallery有两个方法: pick 和 save 通过名称可知一个是选择图库文件一个是保存到图库中,这里只使用了 pick 方法。

    void plus.gallery.pick(successCB, errorCB, options);
    
    // 从相册中选择图片 
    function galleryImg() {
    	// 从相册中选择图片
    	console.log("从相册中选择图片:");
        plus.gallery.pick( function(path){
          // 返回的路径等会上传的时候要用
        	console.log(path);
        }, function ( e ) {
          // 失败的回调函数
        	console.log( "取消选择图片" );
        }, {
          // 图片获取的选项
          
          // 图库文件过滤选项
          filter:"image",
          
        } );
    }
    // 从相册中选择多张图片 
    function galleryImgs(){
    	// 从相册中选择图片
    	console.log("从相册中选择多张图片:");
        plus.gallery.pick( function(e){
        	for(var i in e.files){
    	    	console.log(e.files[i]);
        	}
        }, function ( e ) {
        	console.log( "取消选择图片" );
        },{
          filter:"image",
          // 是否可以多选
          multiple:true,
          // 设定最多可选取数量
          maximum:3,
          // 是否使用系统相册文件选择界面
          system:false,
          // 当超过设定的选取数量触发的事件
          onmaxed:function(){
            plus.nativeUI.alert('最多只能选择3张图片');
            }
        });
    }
    
      // 获取相册图片
      // 从相册中选择多张图片
      galleryImgs(url, imgMaxNum) {
    	// 从相册中选择图片
    	console.log('从相册中选择多张图片:')
    	plus.gallery.pick(function (e) {
    		// 成功回调
    		console.log(e)
    		// 如果选取成功则执行上传功能
    		// 创建任务
    		// 返回以upload对象
    		let task = plus.uploader.createUpload(url,
    		  {
    			method: 'POST',
    			// 上传任务每次上传的文件块大小(仅在支持断点续传的服务有效)
    			// 数值类型,单位为Byte(字节),默认值为102400,若设置值小于等于0则表示不分块上传
    			blocksize: 10000000000000000000000000,
    			// 上传任务的优先级,数值类型,数值越大优先级越高,默认优先级值为0。
    			priority: 100,
    			// 上传任务超时时间
    			timeout: 51000
    		  },
    		  // 完成函数,成功失败都会调用次函数
    		  function (t, status) {
    			// 上传完成
    			if (status == 200) {
    			  // 上传成功返回url
    			  alert('Upload success: ' + t.url)
    			} else {
    			  alert('Upload failed: ' + status)
    			}
    		  }
    		)
    
    		// 遍历添加文件
    		for (var i in e.files) {
    		  // 使用图片选取后返回的文件路径
    		  // param 1添加上传文件的路径
    		  // param2  可通过此参数设置上传任务属性,如文件标识、文件名称、文件类型等, key如果重复会导致上传失败
    		  // 函数返回一个布尔值,代表添加文件成功与否
    		  task.addFile(e.files[i], { key: 'ducha' + i + Math.random() * 10 })
    		}
    
    		// 添加上传数据
    		if (imgType !== undefined) {
    		  task.addData('IMG_TYPE', imgType)
    		}
    		task.start()
    
    	  }, function (e) {
    		// 失败回调
    		console.log('取消选择图片')
    	  },
    	  {
    		// options
    		filter: 'image',
    		// 多选
    		multiple: true,
    		// 是否调用手机终端自带的相册页面
    		system: true,
    		maximum: imgMaxNum || '',
    		onmaxed: function () {
    		  plus.nativeUI.alert('最多只能选择' + imgMaxNum + '张图片')
    		}
    	  })
      }
    

    拍照

    camera

    Camera模块管理设备的摄像头,可用于拍照、摄像操作,通过plus.camera获取摄像头管理对象。

    它具有一个方法 getCamera

    // 返回一个摄像头管理对象,只有需要拍照和录像功能需要先获取此对象才行
    
    // index 表示摄像头,1默认摄像头(主摄像头),2表示副摄像头
    
    Camera =  plus.camera.getCamera( index )
    

    Camera 摄像头管理对象具有三个方法,分别是获取拍照功能 captureImage 和获取录像功能 startVideoCaputer  和停止录像功能 stopVideoCaputer 。
       我们使用 captureImage 方法进行拍照功能的实现。

    功能具有拍照,压缩,上传功能

    
    /**
     *
     * @param {上传的url} url
     * @param {上传后得到的回调} callback
     * @param {上传失败的回调} errBack
     */
    function camera(url, callback, errBack) {
      // 获取到camera
      let cmr = plus.camera.getCamera();
      // 调用cmr的captureImage方法进行拍照功能的调用
      cmr.captureImage(function() {
        // 成功回调
        // 通过resolveFileSystemURL 获取真实地址
        plus.io.resolveLocalFileSystemURL(e, function(entry) {
          let imgUrl = entry.toLocalURL();
          let imgName = new Date().valueOf();
          let imgSuffix = imgUrl.substr(e.lastIndexOf('/') + 1);
    
          // 进行压缩
          plus.zip.compressImage(
            {
              src: imgUrl,
              // 压缩后图片的路径
              dst: '_doc/' + imgName + imgSuffix,
              overwrite: true,
              quality: 50,
              // 高度可以根据自己的需求设定
              height: '100px'
            },
            function(event) {
              // 压缩成功回调
              let target = event.target;
              // 调用上传组件
              upload(url, target, callback, errBack);
            },
            function() {
              // 失败回调
            }
          );
        });
      });
    }
    
    /**
     *
     * @param {上传的url} url
     * @param {用来上传的图片地址} target
     * @param {上传后得到的回调} callback
     * @param {上传失败的回调} errBack
     */
    function upload(url, target, callback, errBack) {
      var task = plus.uploader.createUpload(
        url,
        {
          method: 'POST',
          blocksize: 888888,
          priority: 100,
          timeout: 51000
        },
        function(data, status) {
          // 上传完成
          if (status === 200) {
            return callback(data.responseText);
          } else {
            errBack(data);
          }
        }
      );
      task.addFile(target, {
        key: 'a' + Math.random() * 10
      });
      task.start();
    }
    
    

    图片预览功能

    使用vue-image-swiper实现一个预览页面

    <template>
      <div class="camera">
        <my-header :title="title" class="xxxxx"></my-header>
        <div class='camera-list'>
          <ul class="show-list">
            <li
              :key="index"
              @click="preview(index)"
              class='add-btn'
              v-for="(l, index) in imageUrl">
              <img :src="l" alt="">
            </li>
            <li
              class="add-btn"
              @click="openGetImage"
            >
              <van-icon name="plus"/>
            </li>
          </ul>
        </div>
        <actionsheet ref="actionsheet" :data="actionsheetData" @change="actionsheetChange" class="select"></actionsheet>
      </div>
    </template>
    
    <script>
      import MyHeader from 'my-header'
      import Actionsheet from 'actionsheet'
      import {camera, pick} from 'getImages'
    
      export default {
        name: 'camera',
        data() {
          return {
            title: '图片上传',
            imageUrl: [],
            actionsheetData: [
              {
                'id': '1',
                'name': '拍照'
              },
              {
                'id': '2',
                'name': '相册'
              }
            ],
          }
        },
        methods: {
          preview(index) {
            this.$imagePreview({
              images: this.images,
              index: index
            })
          },
          openGetImage() {
            this.$refs.actionsheet.show()
          },
          // 弹出标签
          actionsheetChange(item) {
            if (item.id === '1') {
              this.getImage()
            } else if (item.id === '2') {
              this.appendByGallery()
            }
          },
          addImg(data) {
            let imgs = data.IMG_URL.split(',')
            for (let i in imgs) {
              imgs[i] = wwwBase + imgs[i]
            }
            let ids = data.IMG_ID.split(',')
            this.imageId = this.imageId + ',' + ids
            // this.SaveImgId(this.imageId)
            this.SaveImgId('3333')
            // this.formDataShow.IMG_ID = this.formDataShow.IMG_ID.concat(ids)
            // this.formDataShow.IMG_URL = this.formDataShow.IMG_URL.concat(imgs)
            // this.formData.IMG_ID = this.formDataShow.IMG_ID.join()
            this.imageUrl = [...this.imageUrl, imgs]
          },
          // 上传失败的统一错误回调
          errorBack(err) {
            alert(err)
          },
          getImage() {
            // 拍照
            let that = this
            camera(url, function (res) {
              res = JSON.parse(res)
                that.addImg(res.data)
            }, this.errorBack, '1')
          },
          appendByGallery() {
            // 相册
            let that = this
            pick(url, function (res) {
              res = JSON.parse(res)
              that.addImg(res.data)
            }, this.errorBack, '1')
          }
        },
        components: {
          MyHeader,
          Actionsheet
        }
      }
    </script>
    
    

    关于后端的服务器和整体项目

    后期会上传到 `github` 上

    展开全文
  • 工程地址: ... 可到群文件下载 1.拍照  拍照API https://docs.unity3d.com/Manual/windowsholographic-photocapture.html 可以在编辑器模式下拍照 PhotoCapture.CreateAsync(fals...

    工程地址:

    https://download.csdn.net/download/shanguuncle/10548611

    可到群文件下载

    1.拍照

     拍照API https://docs.unity3d.com/Manual/windowsholographic-photocapture.html

    可以在编辑器模式下拍照

    PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);

    第一个参数布尔值是否拍摄全息画面,如果只拍摄摄像头就false,拍摄全息就true

       
    
        public PhotoCapture photoCaptureObj = null;
        List<byte> imageBufferList = new List<byte>();
        CameraParameters cameraParameters;
    
     public void TakePhoto()
        {
            ShowImage.gameObject.SetActive(true);
    #if UNITY_EDITOR || UNITY_WSA
            PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
    #else
    
    #endif
        }
    
      void OnPhotoCaptureCreated(PhotoCapture captureObject)
        {
            photoCaptureObj = captureObject;
    
            Resolution  cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
            cameraParameters = new CameraParameters();
            cameraParameters.hologramOpacity = 0.0f;
            cameraParameters.cameraResolutionHeight = cameraResolution.height;
            cameraParameters.cameraResolutionWidth = cameraResolution.width;
            cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;
    
            captureObject.StartPhotoModeAsync(cameraParameters, OnPhotoModeStarted);
        }
    
    
        private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
        {
            if (result.success)
            {
                photoCaptureObj.TakePhotoAsync(OnCaptturePhotoToMemory);
                Debug.Log("拍照成功");
            }
            else
            {
                //重新拍照
                // PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
                Debug.Log("重新拍照");
            }
        }
    
        void OnCaptturePhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
        {
            if (result.success)
            {
                //照片显示
                photoCaptureFrame.CopyRawImageDataIntoBuffer(imageBufferList);
                imageBufferList = FlipVertical(imageBufferList, cameraParameters.cameraResolutionWidth, cameraParameters.cameraResolutionHeight, 4);
                targetTexture = CreateTexture(imageBufferList, cameraParameters.cameraResolutionWidth, cameraParameters.cameraResolutionHeight);
                ShowImage.sprite = Sprite.Create(targetTexture, new Rect(0, 0, targetTexture.width, targetTexture.height), new Vector2(0.5f, 0.5f));
            }
            photoCaptureObj.StopPhotoModeAsync(OnStoppedPhotoMode);
        }
    
        void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
        {
            photoCaptureObj.Dispose();
            photoCaptureObj = null;
        }
    
    
        private Texture2D CreateTexture(List<byte> rawData, int width, int height)
        {
            Texture2D tex = new Texture2D(width, height, TextureFormat.BGRA32, false);
            tex.LoadRawTextureData(rawData.ToArray());
            tex.Apply();
            return tex;
        }
        /// <summary>
        /// 照片上下反转
        /// </summary>
        /// <param name="src"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="stride"></param>
        /// <returns></returns>
        private List<byte> FlipVertical(List<byte> src, int width, int height, int stride)
        {
            byte[] dst = new byte[src.Count];
            for (int y = 0; y < height; ++y)
            {
                for (int x = 0; x < width; ++x)
                {
                    int invY = (height - 1) - y;
                    int pxel = (y * width + x) * stride;
                    int invPxel = (invY * width + x) * stride;
                    for (int i = 0; i < stride; ++i)
                    {
                        dst[invPxel + i] = src[pxel + i];
                    }
                }
            }
            return new List<byte>(dst);
        }

    保存图片到本地

      public void SavePhoto()
        {
            //Texture2D tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, true);
            //tex.Apply();
            SavenPic(targetTexture,"test");
            VideoImage.gameObject.SetActive(false);
            ShowImage.gameObject.SetActive(false);
        }
        public void SavenPic(Texture2D tex, string filename)
        {
            try
            {
                string path = Application.persistentDataPath + "/" + filename + ".jpg";
                File.WriteAllBytes(path, tex.EncodeToJPG());
                ShowImage.sprite = null;
                print("保存成功!" + path);
    
            }
            catch (System.Exception e)
            {
                print("保存失败!" + e.Message);
    
            }
    
        }

     读取图片

      public void ShowPhoto() 
        {
            VideoImage.gameObject.SetActive(false);
            ShowImage.gameObject.SetActive(true);
            StartCoroutine(LoadPic("test"));
        }
    
        private IEnumerator LoadPic(string picname)
        {
            string path = Application.persistentDataPath + "/" + picname + ".jpg" ;
            if (File.Exists(path))
            {
                WWW www = new WWW("file:///" + path);
                yield return www;
    
                //获取Texture
                Texture2D dynaPic = www.texture;
                ShowImage.sprite = Sprite.Create(dynaPic, new Rect(0, 0, dynaPic.width, dynaPic.height), new Vector2(0.5f, 0.5f));
                print("读取成功");
            }
            else
            {
                print("图片不存在!");
            }
        }

    2.录像

    录像API https://docs.unity3d.com/Manual/windowsholographic-videocapture.html

    编辑器模式下不可用,只有在Hololens上能使用

       VideoCapture m_VideoCapture = null;
        bool isRecording;
        public void StopVideo()
        {
            if (isRecording)
            {
                isRecording = false;
                print("停止录像...");
                if(Application.platform==RuntimePlatform.WSAPlayerX86)
                m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);   
            }
        }
        public void TakeVideo()
        {
            VideoImage.gameObject.SetActive(false);
            ShowImage.gameObject.SetActive(false);
    
            if (!isRecording)
            {
               
                isRecording = true;
                print("开始录像...");
                if (Application.platform == RuntimePlatform.WSAPlayerX86)
                VideoCapture.CreateAsync(false, StartVideoCapture);
            }
        }
     void StartVideoCapture(VideoCapture videoCapture)
        {
    
            if (videoCapture != null)
            {
                m_VideoCapture = videoCapture;
                Debug.Log("Created VideoCapture Instance!");
    
                Resolution cameraResolution = VideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
                float cameraFramerate = VideoCapture.GetSupportedFrameRatesForResolution(cameraResolution).OrderByDescending((fps) => fps).First();
                Debug.Log("刷新率:" + cameraFramerate);
    
                CameraParameters cameraParameters = new CameraParameters();
                cameraParameters.hologramOpacity = 0.0f;
                cameraParameters.frameRate = cameraFramerate;
                cameraParameters.cameraResolutionWidth = cameraResolution.width;
                cameraParameters.cameraResolutionHeight = cameraResolution.height;
                cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;
    
                m_VideoCapture.StartVideoModeAsync(cameraParameters,
                    VideoCapture.AudioState.ApplicationAndMicAudio,
                    OnStartedVideoCaptureMode);
            }
            else
            {
                Debug.LogError("Failed to create VideoCapture Instance!");
            }
        }
    
        void OnStartedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
        {
            Debug.Log("开始录像模式!");
            //string timeStamp = Time.time.ToString().Replace(".", "").Replace(":", "");
            //string filename = string.Format("TestVideo_{0}.mp4", timeStamp);
            string filename = "TestVideo.mp4";
            string filepath = Path.Combine(Application.persistentDataPath, filename);
            filepath = filepath.Replace("/", @"\");
            m_VideoCapture.StartRecordingAsync(filepath, OnStartedRecordingVideo);
            print("videopath:"+ filepath);
        }
    
        void OnStoppedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
        {
            m_VideoCapture.Dispose();
            m_VideoCapture = null;
            Debug.Log("停止录像模式!");
        }
    
        void OnStartedRecordingVideo(VideoCapture.VideoCaptureResult result)
        {
            Debug.Log("开始录像!");
        }
    
        void OnStoppedRecordingVideo(VideoCapture.VideoCaptureResult result)
        {
            Debug.Log("停止录像!");
            m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
        }

    播放录制的视频

     public void PlayVideo()
        {
            if (File.Exists(Application.persistentDataPath + "/TestVideo.mp4"))
            {
                VideoImage.gameObject.SetActive(true);
                ShowImage.gameObject.SetActive(false);
    
                print("播放视频...");
                VideoImage.url = "file:///" + Application.persistentDataPath + "/TestVideo.mp4";
                VideoImage.Play();    
            }
            else
            {
                print("视频不存在!");
            }
        }

    3.打包勾选权限

    打包需勾选摄像头和麦克风权限

    Player settings->Capabilities

    Hololens运行截图

    展开全文
  • 更换头像或者上传图片功能已基本是每个 APP 所具备的基础功能了,但这对于开发者来说是一个很麻烦的事情,除机型之外,适配版本就至少要考虑这几种情况(6.0以下版本、6.0的动态权限、7.0的FileProvider、8.0的特殊...
  • android 不预览拍照 后台拍照

    千次下载 热门讨论 2020-07-30 23:32:31
    调用摄像头实现不预览拍照,后台拍照,并转换照片格式为竖屏,保存到SD卡
  • 目前支持谷歌、火狐浏览器
  • 我们常见的上传文件或者图片 是...如果是上传照片图片,安卓机有一个问题,只能选取照片,不能去调取相机进行拍照。 而苹果机 ios系统的 会直接出现选择 相机拍照还是照片图库。 所以解决安卓调取照相机的问题,...
  • Android如何调用系统现有的照相机拍照与摄像

    千次下载 热门讨论 2020-07-30 23:32:29
    Android如何调用系统现有的照相机拍照与摄像,详细参见博客:http://www.cnblogs.com/plokmju/p/Android_SystemCamera.html
  • 不止一次听到同学的抱怨,说Win7下貌似没有用摄像头拍照的功能。在XP系统中貌似是在“我的电脑”里就能找到摄像头,也可以直接拍照。Win7没有了这项功能。我不知道Win7到底是不是还自带了拍照功能,也不想去找。与其...
  • 近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是通过自定义的方式来实现手机照相的...
  • 最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了! 不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是很清晰,所以需要在调用照相机的时候,事先生成一个地址,用于标识拍照的图片...
  • Android 调用系统照相机拍照和录像
  • 我用下面的代码来实现拍照功能。但是它总是返回一个空白图像.错误出现在哪呢? Camera.Parameters p = camera.getParameters(); List<Size> sizes = p.getSupportedPictureSizes(); // Choose any one you ...
  • 使用intent调用系统照相机拍照

    千次阅读 2016-09-15 10:20:30
    1.使用intent调用系统照相机拍照 static final int REQUEST_IMAGE_CAPTURE = 1; private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if ...
  • [UE4][Blueprint]虚幻4实现照相机拍照功能 创建渲染目标,绘制渲染目标,创建动态材质实例,设置实例图片参数为渲染目标,setbrush
  • 前段时间在做face++相关的功能,对于照相机也是进行了一番研究,小有收获,解决了不少拍照预览图片模糊、部分机型黑屏等问题,目前已经保证了团队里面十多部安卓手机的完美适配。
  • 最近用到了android中的照相机功能,android中实现拍照的方式有两种,一种是调用系统自带的照相机进行拍照,此种方法较为简单,因为是android本身就已经实现了的;另一种就是自己来实现一个拍照程序,可按照自己的...
  • android调用照相机拍照获取照片并…

    万次阅读 2014-06-23 13:15:30
    1.调用系统的照相机程序 Intent intent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE);  startActivityForResult(intent,TAKE_PHOTO_WITH_DATA); 2.在onActivityResult中处理返回的data final Bitmap photo = data...
1 2 3 4 5 ... 20
收藏数 130,401
精华内容 52,160
关键字:

拍照