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);
        }
    });
}

位是a:

public static Bitmap bit;

每当我尝试在其他任何地方访问此位图时,我都会得到一个null异常错误。我猜这与它被设置在setPreviewCallback中有关,但我对Android的了解不够,无法修复它。我能做些什么来访问这个位图吗?或者有其他方法可以使用相机所看到的实时位图吗?

我能做些什么来访问这个位图吗?

您已经可以访问Bitmap。你是从decodeByteArray()得到的。

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

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

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

最新更新