我正试图从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
所拥有的所有内容。