Xamarin.Android(C#):Android.Media.Image转Bitmap(替代弃用的Renderscript)
在Xamarin.Android中实现Android.Media.Image到Bitmap的转换(替代弃用的RenderScript)
针对API 31+ RenderScript弃用的问题,以下是几种可行的C#实现方案:
方案1:使用ImageDecoder(API 29+ 推荐)
Android 10(API 29)引入的ImageDecoder是官方推荐的替代方案,可直接从Image的字节数据解码生成Bitmap,代码简洁且性能稳定。
using Android.Media; using Android.Graphics; public Bitmap ImageToBitmapUsingImageDecoder(Image image) { // 获取Image的ByteBuffer(以YUV_420_888格式为例,多数相机输出为此格式) var buffer = image.GetPlanes()[0].Buffer; byte[] imageBytes = new byte[buffer.Remaining()]; buffer.Get(imageBytes); // 使用ImageDecoder解码字节流 var source = ImageDecoder.CreateSource(new ByteArrayInputStream(imageBytes)); return ImageDecoder.DecodeBitmap(source, (decoder, info, source) => { // 可在此配置解码参数,比如缩放、色彩空间等 decoder.SetTargetColorSpace(ColorSpace.Get(ColorSpace.Named.Srgb)); }); }
方案2:手动处理YUV420_888格式转换(兼容低版本)
如果需要兼容API 29以下的设备,可以手动解析Image的YUV平面数据,转换为RGB格式后生成Bitmap。
using Android.Media; using Android.Graphics; public Bitmap YuvImageToBitmap(Image image) { Image.Plane[] planes = image.GetPlanes(); ByteBuffer yBuffer = planes[0].Buffer; ByteBuffer uBuffer = planes[1].Buffer; ByteBuffer vBuffer = planes[2].Buffer; int ySize = yBuffer.Remaining(); int uSize = uBuffer.Remaining(); int vSize = vBuffer.Remaining(); byte[] yuvBytes = new byte[ySize + uSize + vSize]; yBuffer.Get(yuvBytes, 0, ySize); vBuffer.Get(yuvBytes, ySize, vSize); uBuffer.Get(yuvBytes, ySize + vSize, uSize); // 创建YuvImage并转换为JPEG字节数组,再解码为Bitmap YuvImage yuvImage = new YuvImage(yuvBytes, ImageFormatType.Nv21, image.Width, image.Height, null); using (MemoryStream ms = new MemoryStream()) { yuvImage.CompressToJpeg(new Rect(0, 0, image.Width, image.Height), 100, ms); byte[] jpegBytes = ms.ToArray(); return BitmapFactory.DecodeByteArray(jpegBytes, 0, jpegBytes.Length); } }
注意:此方法依赖
YuvImage,仅支持NV21/YUY2格式,多数相机输出的YUV_420_888可转换为NV21格式使用。
方案3:使用AndroidX Camera工具类(依赖绑定库)
如果你已引入Xamarin.AndroidX相关库,可以使用AndroidX Camera库封装的工具类简化转换:
using AndroidX.Camera.Core.Utils; using Android.Media; using Android.Graphics; public Bitmap ImageToBitmapUsingJetpack(Image image) { return ImageUtil.YuvImageToBitmap(image); }
此方法封装了YUV转Bitmap的底层逻辑,无需手动处理平面数据,但需要确保项目已引入Xamarin.AndroidX.Camera.Core包。
内容的提问来源于stack exchange,提问作者Nathan Sokalski
相关产品推荐
相关产品推荐

