【发布时间】:2015-08-23 18:33:32
【问题描述】:
我正在尝试从 Android 中的相机预览中获取位图,然后检查位图并根据相机所看到的内容在屏幕上绘制一些内容。由于我正在从事的项目的性质,这一切都必须现场完成。
目前我正在使用表面视图来显示实时预览,并且我正在使用我在此处的单独问题上找到的以下代码获取位图。
@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 的了解不够,无法修复它。我可以做些什么来访问这个位图吗?还是有其他方法可以处理相机所见内容的实时位图?
【问题讨论】:
-
“我猜这与它被设置在 setPreviewCallback 中的事实有关”——更重要的是,它还没有被设置。 “我可以做些什么来访问这个位图吗?” -- 将您的代码直接或通过
onPreviewFrame()放入现有的onPreviewFrame()方法中,并去掉static Bitmap。或者,如果使用位图完成的工作可能比您在主应用程序线程上花费的时间更长,请使用AsyncTask或其他方式来完成这项工作。 -
除此之外,使用调试器或
Log语句来确认您的decodeByteArray()方法正在被调用并返回非nullBitmap,并摆脱@987654331 @调用以节省堆空间和CPU时间。 -
如果我将我的代码放在现有的 OnPreviewFrame() 方法中,我不能在屏幕上绘制,可以吗?
-
"如果我把我的代码放在现有的 OnPreviewFrame() 方法中,我不能在屏幕上绘图,对吗?" -- 在主应用程序线程上调用
onPreviewFrame(),或者不调用。如果在主应用程序线程上调用它,欢迎您更新您的 UI。如果没有,您可以使用事件总线,或post(),或runOnUiThread(),或Handler,安排在主应用程序线程上运行一些代码。 -
抱歉,我的回答不清楚。现在,surfaceview 被锁定以进行绘图,因为相机一直在锁定它。我最初的想法是获取这个位图,修改我需要的像素,然后使用单独的表面绘制它。我无法将这些数据传递给单独的视图。我可以在这个函数内绘制到表面吗?
标签: android bitmap android-camera