【问题标题】:How to save photo from Camera Android如何从 Android 相机中保存照片
【发布时间】:2013-04-26 17:03:14
【问题描述】:

编辑:我发现问题出在 onPreviewFrame 函数中:

@Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        if (frameCount == 0) {
            start = System.currentTimeMillis();
        } else if (frameCount % 100 == 0) {
            Log.e("FPS", 1000 * frameCount
                    / (System.currentTimeMillis() - start) + "");
        }
        frameCount++;
        Bitmap temp = BitmapFactory.decodeByteArray(data, 0, data.length);
        try {
            temp.compress(CompressFormat.JPEG, 90, new FileOutputStream(new File("/sdcard/"+frameCount+".jpg")));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        camera.addCallbackBuffer(data);
    }

如果我删除所有与位图相关的代码,那么程序可以拍照而不会出现任何错误。如何保存帧图像和使用 Camera.takePicture 生成的更好图像? 当触摸按钮并开始另一个活动来编辑照片时,我试图从相机中保存照片。

mTakePic.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mTakePic.setImageDrawable(takePicDown);
                    mCamera.takePicture(new ShutterCallback() {

                        @Override
                        public void onShutter() {
                            // TODO Auto-generated method stub

                        }
                    }, null, new PictureCallback() {


                        @Override
                        public void onPictureTaken(byte[] yuv, Camera camera) {
                            Intent editImage = new Intent(getApplicationContext(), EditActivity.class);

                            if(savePhoto != null) {
                                try {
                                    savePhoto.get();
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                } catch (ExecutionException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                            savePhoto = new SavePhotoTask();
                            savePhoto.execute(yuv);

//                          releaseCamera();
                            startActivity(editImage);
                        }
                    });
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mTakePic.setImageDrawable(takePicUp);
                }
                return true;
            }
        });

有时它运行平稳而没有错误,但大多数时候它最终会出错,我必须重新启动手机才能让相机再次工作。我使用 SurfaceView 预览相机帧。

【问题讨论】:

    标签: android camera android-camera photo image


    【解决方案1】:

    编辑:对不起,我弄错了问题,我以为您将您提到的崩溃链接到 SavePhotoTask。以下是如何保存来自 PictureCallback 的照片

    onPictureTaken 的第一个参数是一个包含图像的字节数组。简单地将其写入文件是我发现保存图像的最佳方式。像这样的...

    FileOutputStream out = new FileOutputStream("path/to/image");
    out.write(data, 0, data.length);
    out.close();
    

    其中“数据”是来自onPictureTaken 的第一个参数。同样的技术应该可以将每个帧保存在onPreviewFrame 中,但我从未尝试过,所以我不能确定。似乎您有将此操作放在单独的线程上的想法,这非常好,我将继续探索该选项。但是,我会避免使用位图,因为这会耗费时间和资源,并且如果您同时转换许多帧并将所有这些位图都保存在内存中,可能会导致 OOM 错误。


    一旦您调用Camera.open(),您的应用就会锁定摄像头并阻止任何其他应用程序(包括您自己的应用程序的后续实例)使用它。当您的应用程序完成后,必须拨打Camera.release() 电话,否则相机将保持锁定状态,直到您已经注意到,手机重新启动。 The dev docs for the Camera has a good checklist to follow at the top in order to ensure the class gets used correctly.

    我已经成功地在onResume()onPause() 中调用Camera.open()Camera.release()。为了使事情顺利进行并且没有错误,您可能还需要在这些时间点管理您的开始和停止预览。

    【讨论】:

    • 谢谢@MattDavis,但这不是我问题的答案。我编辑了问题,请看一下
    • 我已经编辑了我的答案以显示如何保存,如果有帮助请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2019-07-30
    • 2011-12-04
    • 2018-06-24
    相关资源
    最近更新 更多