从 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());

但这就是结果:

enter image description here

这只是一个实际保存和检查捕获帧的测试,因为在此结束时我仍然没有位图(即使它可以工作)。

在实时处理中,我不想要/不需要 JPG 转换,因为它只会减慢一切。 我想将图像转换为位图,裁剪它并将其作为垫子提供给 Emgu。

有什么建议吗? 谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)