如何解决从 Android.Media.Image 转换为 Android.Graphics.Bitmap可能使用 Xamarin
我有一个从 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 举报,一经查实,本站将立刻删除。