jjwwwww 2017-09-11 03:13
浏览 1041

Android关于相机快速拍照问题

我用的是Android cameraAPI2,现在遇到一点问题,我初步学会如何进行拍照,主要是通过IamgeReader来获得照片,但是我发现每次由拍照到成像的过程需要0.5秒左右,我希望每次拍照的时间在0.2秒以下,不知道有什么办法达到。
下面是我拍照的程序tackpicture()和imagereadlisten的部分代码,希望有相关开发经历的同志能给点意见。

 public void TakePicture(int rotation) {
        Log.e("MainTime",""+System.currentis());
        if (camera == null&&captureSession==null) {
            Toast.makeText(context,"设备还未准备就绪",Toast.LENGTH_SHORT)
                    .show();
            return;
        }
        try {
            if (captureRequestBuilder==null) {

                captureRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
                captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);

                Long max = characteristics.get(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION);
                int a[] = characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS);
                for (int b : a) {
                    if (b == CameraCharacteristics.CONTROL_EFFECT_MODE_MONO) {
                        Log.e("Its", "YES");
                        //captureRequestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
                        break;
                    }
                }
                Range<Integer> range1 = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);

                captureRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, range1.getUpper());
                captureRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 83333L);
                captureRequestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, max / 6000);
            }
            // 根据设备方向计算设置照片的方向
            captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
            //拍照
            captureRequestBuilder.addTarget(reader.getSurface());
            CaptureRequest mCaptureRequest = captureRequestBuilder.build();

            captureSession.capture(mCaptureRequest,null,handler);

        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }
 @Override
        public void onImageAvailable(ImageReader reader) {
            Image image =reader.acquireNextImage();
            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
            byte[] bytes= new byte[buffer.remaining()];
            buffer.get(bytes);//由缓冲区存入字节数组

            bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            int width=bitmap.getWidth();
            int height=bitmap.getHeight();

            //bitmap.getPixels(pixel[T++],0,width,0,0,width,height);
            Log.e("MainTime",""+System.currentTimeMillis());
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 Python安装cvxpy库出问题
    • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
    • ¥15 python天天向上类似问题,但没有清零
    • ¥30 3天&7天&&15天&销量如何统计同一行
    • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
    • ¥15 C#调用python代码(python带有库)
    • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
    • ¥15 活动选择题。最多可以参加几个项目?
    • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
    • ¥15 vs2019中数据导出问题