我已经实现了一个简单的应用程序,在屏幕上显示相机图片.我现在要做的是抓取一个帧并将其作为位图处理.从我能找到的东西到这一点,这不是一件容易的事.
我已经尝试使用onPreviewFrame方法,您将当前帧作为字节数组,并尝试使用BitmapFactory类解码它,但它返回null.帧的格式是无头YUV,可以转换为位图,但在手机上需要太长时间.另外我已经读过onPreviewFrame方法在运行时有约束,如果它需要太长时间,应用程序可能会崩溃.
那么这样做的正确方法是什么?
我正在使用相机的previewCallback尝试抓取图像.这是我正在使用的代码
private Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback()
{
public void onPreviewFrame( byte[] data, Camera Cam ) {
Log.d("CombineTestActivity", "Preview started");
Log.d("CombineTestActivity", "Data length = "
+ data.length );
currentprev = BitmapFactory.decodeByteArray( data, 0,
data.length );
if( currentprev == null )
Log.d("CombineTestActivity", "currentprev is null" );
Log.d("CombineTestActivity", "Preview Finished" );
}
};
Run Code Online (Sandbox Code Playgroud)
数据的长度总是与576000相同.
此外,我尝试更改相机的参数,以便图像以不同的格式返回.这就是我这样做时的样子.
mCamera = Camera.open();
camParam = mCamera.getParameters();
camParam.setPreviewFormat( ImageFormat.RGB_565 );
mCamera.setParameters( camParam );
mCamera.setPreviewCallback( mPrevCallback );
Run Code Online (Sandbox Code Playgroud)
但是,当我更改预览格式并将其保留为默认值NV21时,BitmapFactory.decodeByteArray将返回null.我也尝试将预览格式更改为JPEG类型.我甚至在ddms中得到了一个调试语句,这就是我得到的
"D/skia(14391):--- SkImageDecoder :: Factory返回null"