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