问题描述
我有一个从 Camera2 API Preview(在 Xamarin 应用程序中)获取的 Android.Media.Image 帧,我想处理它。 图片格式为YUV_420_888。
在之前的迭代中,我能够从 CameraPreview 获取 Android.Graphics.Bitmap(但现在不再),并且使用该位图我能够:
- 裁剪
- 将其转换为 JPEG、保存或发送到服务器
- 将其转换为 Mat 以使用 Emgu 实时处理
我搜索了如何从 Android.Media.Image 转换为 Android.Graphics.Bitmap 认为这会非常简单,但事实并非如此。 我发现大部分是我试图转换为 C# Xamarin 但没有成功的 Java 代码。
第一步应该是转换为 YuvImage(找到 2 个不同的版本,因此有评论):
private static byte[] YUV_420_888toNV21(Android.Media.Image image)
{
byte[] nv21;
ByteBuffer yBuffer = image.GetPlanes()[0].Buffer;
ByteBuffer uBuffer = image.GetPlanes()[1].Buffer;
ByteBuffer vBuffer = image.GetPlanes()[2].Buffer;
int ySize = yBuffer.Remaining();
int uSize = uBuffer.Remaining();
int vSize = vBuffer.Remaining();
nv21 = new byte[ySize + uSize + vSize];
//yBuffer.Get(nv21,ySize);
//vBuffer.Get(nv21,ySize,vSize);
//uBuffer.Get(nv21,ySize + vSize,uSize);
yBuffer.Get(nv21,ySize);
uBuffer.Get(nv21,uSize);
vBuffer.Get(nv21,ySize + uSize,vSize);
return nv21;
}
然后保存:
var bbitmap = YUV_420_888toNV21(image);
YuvImage yuv = new YuvImage(bbitmap,ImageFormatType.Nv21,image.Width,image.Height,null);
var ms = new MemoryStream();
yuv.CompresstoJpeg(new Android.Graphics.Rect(0,image.Height),100,ms);
File.WriteallBytes("/sdcard/Download/testFrame.jpg",ms.ToArray());
但这就是结果:
这只是一个实际保存和检查捕获帧的测试,因为在此结束时我仍然没有位图(即使它可以工作)。
在实时处理中,我不想要/不需要 JPG 转换,因为它只会减慢一切。 我想将图像转换为位图,裁剪它并将其作为垫子提供给 Emgu。
有什么建议吗? 谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)