You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:37:04