使用 Xamarin.Android 和 C# 将 Android.Media.Image 转换为 Android.Graphics.Bitmap



我需要从Android.Media.Image转换为Android.Graphics.Bitmap用于Xamarin。Android应用程序使用c#。我找到的许多答案(似乎没有工作,更不用说我有困难理解)提到Renderscript &ScriptIntrinsicYuvToRGB,但Renderscript已在API 31中弃用。我以前从来没有使用过Renderscript,所以迁移指南没有多大帮助。从Android.Media.Image转换到Android.Graphics.Bitmap的Xamarin最好的方法是什么?Android应用程序使用c#

您可以尝试获取Android.Media.Image的字节并将字节转换为位图。

请参考以下代码:

public Bitmap ConvertMediaImageToBitMap(Android.Media.Image image)
        {
            ByteBuffer buffer = image.GetPlanes()[0].Buffer;
            byte[] bytes = new byte[buffer.Capacity()];
            buffer.Get(bytes);
            Bitmap bitmapImage = BitmapFactory.DecodeByteArray(bytes, 0, bytes.Length, null);
           return bitmapImage;
        }

我相信我已经找到了一个工作的解决方案,这里是一个扩展方法,似乎工作:

public static Bitmap ToBitmap(this Image img)
{
ByteBuffer ybuffer = img.GetPlanes()[0].Buffer;
ByteBuffer vubuffer = img.GetPlanes()[2].Buffer;
ybuffer.Position(0);
vubuffer.Position(0);
int ysize = ybuffer.Remaining();
int vusize = vubuffer.Remaining();
byte[] nv21 = new byte[ysize + vusize];
ybuffer.Get(nv21, 0, ysize);
vubuffer.Get(nv21, ysize, vusize);
YuvImage yuvimage = new YuvImage(nv21, ImageFormatType.Nv21, img.Width, img.Height, null);
MemoryStream outstream = new MemoryStream();
yuvimage.CompressToJpeg(new Rect(0, 0, yuvimage.Width, yuvimage.Height), 50, outstream);
byte[] imagebytes = outstream.ToArray();
return BitmapFactory.DecodeByteArray(imagebytes, 0, imagebytes.Length, null);
}

请注意.Position(0);语句,如果使用相同的Image多次调用该方法,则这些语句非常重要。这可能是一种罕见的或不太可能的情况,但我花了一段时间才发现,所以如果它确实出现了,这是很好的。希望最终有一个解决方案(非常感谢你和其他论坛)可以相同的很多人的挫折,它需要找到它。

最新更新