我正在编写一个应用程序来捕获相机预览帧并将其转换为Android中的位图。这是我的代码:
Camera.PreviewCallback previewCallback = new Camera.PreviewCallback()
{
public void onPreviewFrame(byte[] data, Camera camera)
{
try
{
BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//,opts);
}
catch(Exception e)
{
}
}
};
mCamera = Camera.open();
mCamera.setPreviewCallback(previewCallback);
开始预览后,使用数据调用回调,但位图为空。
将字节数组转换为BitMap时,我做错了什么?
答案 0 :(得分:18)
在onPreviewFrame()
功能中,您应首先检查图像格式。
这是NV21的例子。
public void onPreviewFrame(byte[] data, Camera camera)
{
Parameters parameters = camera.getParameters();
imageFormat = parameters.getPreviewFormat();
if (imageFormat == ImageFormat.NV21)
{
Rect rect = new Rect(0, 0, PreviewSizeWidth, PreviewSizeHeight);
YuvImage img = new YuvImage(data, ImageFormat.NV21, PreviewSizeWidth, PreviewSizeHeight, null);
OutputStream outStream = null;
File file = new File(NowPictureFileName);
try
{
outStream = new FileOutputStream(file);
img.compressToJpeg(rect, 100, outStream);
outStream.flush();
outStream.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
另一种拍照方式,请查看此文章:how to use camera in android
答案 1 :(得分:1)
在使用BitmapFactory之前,您是否尝试将预览帧数据解码为RGB?默认格式是YUV,我不确定它与BitmapFactory兼容。 Dave Manpearl的解码方法可以在这里找到:
Getting frames from Video Image in Android
让我知道它是否有效。
干杯,
保