0

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

4

3 回答 3

1

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

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

于 2013-07-07T04:04:31.450 回答
0

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

SurfaceView view = new SurfaceView(this);
c.setPreviewDisplay(view.getHolder());
c.startPreview();
c.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);
于 2013-07-06T20:24:55.230 回答
0

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

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

现在我们已经保存了临时文件,我们稍后将访问它并将其移动到我们新的所需文件位置。 如何复制文件。

temp.deleteOnExit();

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

于 2013-07-09T04:37:38.617 回答