【问题标题】:Save a captured image保存捕获的图像
【发布时间】:2014-11-23 13:16:36
【问题描述】:

我有这段代码(仅供实验):

public void captureFromCam(View v) throws CameraAccessException {
    try {
        cm.openCamera("0", new CameraDevice.StateCallback(){
            @Override
            public void onClosed(CameraDevice camera) {
                super.onClosed(camera);
            }

            @Override
            public void onError(CameraDevice camera, int error) {

            }

            @Override
            public void onOpened(final CameraDevice cam) {
                Log.d("CameraApp", "Camera Opened");
                ImageReader ir = ImageReader.newInstance(800, 600, 256, 1);
                Surface surface = ir.getSurface();
                final ArrayList<Surface> l = new ArrayList();
                l.add(surface);
                try {
                    cam.createCaptureSession(l, new CameraCaptureSession.StateCallback() {
                        @Override
                        public void onConfigured(CameraCaptureSession session) {
                            Log.e("CameraApp", "Configured");
                            CaptureRequest.Builder builder = null, b2;
                            try {
                                builder = cam.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
                            } catch (CameraAccessException e) {
                                e.printStackTrace();
                            }
                            builder.addTarget(l.get(0));
                            CaptureRequest request = builder.build();
                            try {
                                session.capture(request, new CameraCaptureSession.CaptureCallback() {
                                    @Override
                                    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                                        Log.e("CameraApp", "Captured");
                                    }
                                }, null);
                            } catch (CameraAccessException e) {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onConfigureFailed(CameraCaptureSession session) {

                        }
                    }, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }

            }

            @Override
            public void onDisconnected(CameraDevice camera) {

            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }

}

有趣的部分是onCaptureCompleted,据我了解,结果不知何故是我的照片。

如何将此图片保存到文件中?或者如果不是我的图片,我的图片在哪里以及如何将其保存到文件中?

我知道这个问题已经得到解答,但这是 API 21,它与旧的非常不同。

【问题讨论】:

    标签: android android-camera android-image


    【解决方案1】:

    我写了一个线程类来保存图片。

    @Override
    public void run() {
        mImageReader.setOnImageAvailableListener(ReaderListener, mHandler);
    }
    
    /**
     * diffrent formats to save diffrent pictures
     */
    ImageReader.OnImageAvailableListener ReaderListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader imageReader) {
            Image image = imageReader.acquireLatestImage();
            checkParentDir();
            File file;
            if (mFormat == ImageFormat.JPEG) {
                checkJpegDir();
                file = createJpeg();
                //here,maybe null, so trycatch
                try {
                    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                    byte[] bytes = new byte[buffer.remaining()];
                    buffer.get(bytes);
                    try {
                        save(bytes, file);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    image.close();
                } catch (Exception e) {
                    Log.i("Exception e", "ImageFormat.JPEG,,,,,,,,Exception eException e");
                    e.getStackTrace();
                }
            } else if (mFormat == ImageFormat.RAW_SENSOR) {
                checkDngDir();
                file = createDng();
                try {
                    if (mDngCreator != null) {
                        mDngCreator.writeImage(new FileOutputStream(file), image);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    Log.i("Exception e", "mDngCreator.writeImage(new FileOutputStream(file), image)");
                }
                try {//image maybe null
                    mDngCreator.close();
                    image.close();
                } catch (Exception e) {
                    Log.i("Exception e", "ImageFormat.RAW_SENSOR,,,,,,,,Exception eException e");
                    e.getStackTrace();
                }
    
            }
        }
    };
    

    【讨论】:

    • 什么是“保存(字节,文件);” ?
    【解决方案2】:

    这个解决方案对我有用,我在 ImageReader.OnImageAvailableListener 回调方法中保存了一张图片。经过一番研发,我找到了这个,试试吧。

    函数调用:saveImage(it.acquireLatestImage(), file)

    /**
     * Save the image to storage
     * @param image Image object from OnImageAvailableListener
     * @param file File where image is going to be written
     * @return File object pointing to the file URI, null if the file already exists
     */
    
    fun saveImage(image: Image, file: File): File? {
        if (file.exists()) {
            image.close()
            return null
        }
        val buffer = image.planes[0].buffer
        val bytes = ByteArray(buffer.remaining())
        buffer.get(bytes)
        val output = FileOutputStream(file)
        output.write(bytes)
        image.close()
        output.close()
        return file
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多