【问题标题】:Save picture while Camera is in stopPreview mode在相机处于停止预览模式时保存图片
【发布时间】:2013-07-06 20:15:03
【问题描述】:

背景 嘿,所以我有一个我自己用代码实现的相机。这意味着我可以访问和控制相机硬件并使用它来保存图片。我可以在相机运行时使用Camera.takePicture()函数保存图片:运行意味着Camera.startPreview();

问题 我的问题是,当相机图像冻结时,我也希望能够保存图像:冻结是当 Camera.stopPreview();被称为。冻结时,我可以在布局中看到图像,但是如何访问它?图片保存在哪里,以便我以后可以修改它?

提前致谢!

------------------更新 1

    jpeg bla;
public class jpeg implements PictureCallback{

    public void onPictureTaken(byte[] data, Camera camera) {
        g_data = data;
    }    
}

这是我的代码的一部分。在这里,我试图将最初保存到全局变量的数据写入。但是 g_data 的值仍然为空,我无法在 onPictureTaken() 回调函数中设置断点。

-----------------更新 2

FileOutputStream outStream = null;
    try {
        // generate the folder
        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MirrorMirror");
        if( !imagesFolder.exists() ) {
            imagesFolder.mkdirs();
        }
        // generate new image name
        SimpleDateFormat formatter = new SimpleDateFormat("HH_mm_ss");
        Date now = new Date();
        String fileName = "image_" + formatter.format(now) + ".jpg";
        // create outstream and write data
        File image = new File(imagesFolder, fileName);
        outStream = new FileOutputStream(image);
        outStream.write(data);
        outStream.close();          
        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
    } catch (FileNotFoundException e) { // <10>
        //Toast.makeText(ctx, "Exception #2", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {}

我之前使用此代码从相机的 onPictureTaken() 函数中保存文件。这里的关键是我需要保存和稍后保存的 byte[] 数据。但是,就像我说的,当我在调试器中检查它时,我只是得到一个空值。

【问题讨论】:

  • 你想拍照而不预览?

标签: java android android-camera


【解决方案1】:

Camera.takePicture 从不查看您指定为 previewDisplay 的视图。实际上,它不是 ImageView,而是 SurfaceView,并且没有 API 可以从中读取像素。

您可以在 stopPreview() 之前抢先调用 takePicture()。稍后,如果您发现您不需要需要该图片,请丢弃它。

【讨论】:

  • 同上!这就是我现在正在尝试实施的。实际上,我越深入,我就越意识到我不知道 takePicture() 是如何工作的。对不起,如果这是一个不好的问题。 -------> 我正在尝试将代码添加到 jpegPictureCallback 类的 takePicture 中,然后使用调试器,但它永远不会在函数内停止。我应该能够很容易地从 takePicture 中保存 byte[] 数据。会报告的
  • 我发布了更新 1,正如我所说,我无法保存从 onPictureTaken(byte[] data, Camera camera) 传递的数据。如果我包含保存到文件的代码,则会保存图像。我不知道发生了什么..
【解决方案2】:

根据documentation,你需要在调用takePicture()之前先调用startPreview() 但是如果你不想预览而只想拍照呢?好吧,您可以为预览创建一个虚拟的 SurfaceView,然后让车库收集器在您完成后抓取它。这是sn-p:

SurfaceView view = new SurfaceView(this);
c.setPreviewDisplay(view.getHolder());
c.startPreview();
c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);

【讨论】:

  • 因此,当我执行 stopPreview() 时,相机会停止更新视图,但最后一张图像仍保留在屏幕上。那是我要保存的图像。如果我执行 startPreview() 然后使用 takePicture 将保存不同的图像(无论相机镜头当时指向哪里)。
  • 一种笨拙的方法可能是截取屏幕截图,然后裁剪掉相机视图周围的所有帧......但这不是我想要的,因为视图可以是动态的。
  • 当您调用 stopPreview() 时,您的表面视图停止预览,当时那里没有相机滚动,但是当您调用 takePicture() 时相机捕获图像,无论最后一刻的表面视图预览。
  • 我无法准确理解如何实现这一点,我的程序崩溃了。这里分配的视图是什么?它只是随机的吗?相机如何知道从使用回调的其他查看器获取图片。
【解决方案3】:

好的,这样做的确切方法是在 stopPreview() 之前拍摄照片并将其保存到临时文件中。实际上,使用此实现时,您永远不会调用 stopPreview()(否则会崩溃),因为 takePicture() 函数会自动停止预览。

try {
        File temp = File.createTempFile("temp", ".jpg");
    } catch (IOException e) {
        e.printStackTrace();
    }

现在我们已经保存了临时文件,我们稍后将访问它并将其移动到我们所需的新文件位置。 How to copy file.

temp.deleteOnExit();

请务必调用 deleteonExit(),以便 Android 在应用关闭后删除文件(如果需要)。

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2013-04-14
    相关资源
    最近更新 更多