Android Surfaceview 中的空位图

Null bitmap in Android Surfaceview

我正在尝试从 Android 中的相机预览中获取位图,然后检查位图并根据相机所看到的内容在屏幕上绘制一些内容。由于我正在进行的项目的性质,这一切都必须现场完成。

目前我正在使用 surfaceview 显示实时预览,并使用我在此处的一个单独问题上找到的以下代码获取位图。

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    snipeCamera.setPreviewCallback(new Camera.PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Parameters parameters = camera.getParameters();

            int width = parameters.getPreviewSize().width;
            int height = parameters.getPreviewSize().height;

            ByteArrayOutputStream outstr = new ByteArrayOutputStream();
            Rect rect = new Rect(0, 0, width, height);
            YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null);
            yuvimage.compressToJpeg(rect, 100, outstr);
            Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());

            bit = bmp.copy(Bitmap.Config.ARGB_8888, true);

        }
    });
}

位是一个:

public static Bitmap bit;

每当我尝试在其他任何地方访问此位图时,都会收到空异常错误。我猜它与它在 setPreviewCallback 中设置的事实有关,但我对 Android 的了解还不足以修复它。我可以做些什么来访问这个位图吗?还是有其他方法可以使用相机所见内容的实时位图?

Is there something I can do to get access to this bitmap?

您已经可以访问您的 Bitmap。您是从 decodeByteArray().

获取的

(请注意,我假设 decodeByteArray() 之前和包括 decodeByteArray() 的代码是正确的——其中可能还潜伏着其他问题)

您只需要在 onPreviewFrame() 方法中使用 Bitmap。如果你要做的工作很快(亚毫秒),可能就在那里做。如果您的工作不是那么快,您现在需要制定后台线程计划,安排使用主应用程序线程上的工作结果和相关问题来更新您的 UI。

如果要使用 Bitmap,您需要访问相机 UI 中的其他对象,只需确保 SurfaceHolder 具有对这些其他对象的引用。您的 onPreviewFrame() 方法位于 SurfaceHolder 内部的匿名内部 class 中,并且 onPreviewFrame() 可以访问 SurfaceHolder 拥有的所有内容。