gpt4 book ai didi

Android(相机)- 如何将 stopPreview() 与 onPictureTaken() 同步?

转载 作者:太空狗 更新时间:2023-10-29 14:27:21 24 4
gpt4 key购买 nike

我有一个客户端使用相机拍照的应用程序。在人们点击我的“点击”按钮之前,图像的预览正在使用 SurfaceView 的平板电脑中显示。当用户点击单击按钮时,将调用 onPictureTaken 方法,在该方法中,我保存图像并调用 camera.stopPreview() 方法(以便用户可以看到拍摄的照片)。

然而,存在一个问题......如果用户在拍摄照片时正在平板电脑周围移动,在调用 stopPreview 方法后实际显示的静止图片与拍摄的照片不对应我进入 onPictureTaken 方法的字节数组。那里有几毫秒的延迟,当用户在拍照前四处移动平板电脑时,这种差异会突出显示(我知道 99% 的人在拍照时不会四处移动平板电脑,但我的客户实际上注意到了这个问题并希望修复它......)。我已尝试将保存操作移动到单独的线程,如下所示,以便 onPictureTaken 方法可以尽可能快地执行。尽管如此,它仍然没有任何影响......

private PictureCallback pictureCallback = new PictureCallback() {

public void onPictureTaken(byte[] data, Camera camera) {

camera.stopPreview();
reference = data;

new PictureCallbackHeavy().execute();
}
};

我还尝试在调用 takePicture 方法之前调用 camera.stopPreview()(而不是在 onPictureTaken() 方法内部)。但结果是一样的。

我可以做些什么来同步 stopPreview 方法,以便我可以准确显示已拍摄的图像,该图像位于 onPictureTaken() 回调的字节数组中?

提前致谢!! =)

最佳答案

不幸的是,您无法仅通过调用 stopPreview() 来获取合理的良好预览图像,因为在拍摄照片和调用 onPictureTaken() 之间可能会经过相当长的一段时间,因为它的工作方式如下:

  • 相机实际拍摄照片(这就是您要预览的照片)
  • onShutter() 被调用
  • 调用原始图像数据的 onPictureTaken()(在某些设备上)
  • 调用缩放预览图像的 onPictureTaken()(在某些设备上)
  • 调用最终压缩图像数据的onPictureTaken()(我们这里说的那个)

因此,您必须将 onPictureTaken() 回调中的 byte[] 数据 转换为 Bitmap 并将该 Bitmap 映射到 ImageView 上,您应该将其放置在 SurfaceView 上方以显示静止预览图像。代码可能看起来像这样:

public void onPictureTaken(byte[] data, Camera camera) {
camera.stopPreview();
final Bitmap image = BitmapFactory.decodeByteArray(data, 0, data.length);
surfaceView.setVisibility(SurfaceView.GONE);
imageView.setVisibility(ImageView.VISIBLE);
imageView.setImageBitmap(image);
reference = data;
new PictureCallbackHeavy().execute();
}

关于Android(相机)- 如何将 stopPreview() 与 onPictureTaken() 同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com