相机处于stopPreview模式时保存图片

时间:2013-07-06 20:15:04

标签: java android android-camera

背景 嘿所以我有一个相机,我已经在代码中实现了自己。这意味着我可以访问和控制相机硬件并使用它来保存图片。当相机正在运行时,我可以使用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的值保持为null,我无法在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 []数据,我需要保存并稍后保存。但是就像我说的那样,当我在调试器中检查它时,我得到一个null。

3 个答案:

答案 0 :(得分:1)

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

你可以在stopPreview()之前预先调用takePicture()。之后,如果您发现需要图片,请将其丢弃。

答案 1 :(得分:0)

根据documentation,你需要在调用takePicture()之前先调用startPreview()但是如果你不想要预览而只是想拍照呢?那么你可以创建一个虚拟SurfaceView用于预览,然后让车库收集器在你完成后抓住它。这是片段:

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

答案 2 :(得分:0)

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

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

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

temp.deleteOnExit();

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