背景 嘿所以我有一个相机,我已经在代码中实现了自己。这意味着我可以访问和控制相机硬件并使用它来保存图片。当相机正在运行时,我可以使用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。
答案 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在应用关闭后删除该文件(如果需要)。