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

从byte[]转System.Drawing.Bitmap再转Avalonia Bitmap显示黑屏求助

问题:System.Drawing.Bitmap转Avalonia Bitmap后显示黑色图像

我尝试将byte[]数据先转为System.Drawing.Bitmap,再转换为Avalonia.Media.Imaging.Bitmap,但在Avalonia的图像控件里只显示黑色图像。传入的byte[]确实是有效数据。

代码如下:

private System.Drawing.Bitmap? _regularBitmap = new (1920, 1080, PixelFormat.Format16bppRgb565);

public void DecodeAndUpdateBitmap(byte[] imageData)
{
    using (MemoryStream ms = new MemoryStream(imageData))
    {
        _regularBitmap.Save(ms, ImageFormat.Jpeg);
        ms.Position = 0;

        _tempImage = new Avalonia.Media.Imaging.Bitmap(ms);
    }
}

问题原因

  • 代码逻辑完全错误:你创建了一个空的System.Drawing.Bitmap(仅初始化尺寸和像素格式,无有效像素数据),接着把包含原始图像数据的MemoryStream用来保存这个空Bitmap,相当于用空数据覆盖了原始图像,后续读取的自然是一张空的JPEG(显示为黑色)。
  • 额外问题:System.Drawing.Bitmap和Avalonia Bitmap跨平台兼容性差,引入System.Drawing会增加不必要的依赖,非Windows平台尤其明显。

解决方案

方案1:直接用Avalonia加载原始byte[](推荐)

如果imageData本身是标准图像格式(如JPEG/PNG)的字节流,完全不需要经过System.Drawing,直接加载即可:

public void DecodeAndUpdateBitmap(byte[] imageData)
{
    using (var ms = new MemoryStream(imageData))
    {
        _tempImage = new Avalonia.Media.Imaging.Bitmap(ms);
    }
}

方案2:处理原始像素数据(如16bppRgb565格式)

如果imageData是原始像素数据(非标准图像格式),需要手动写入Avalonia的WriteableBitmap:

public void DecodeAndUpdateBitmap(byte[] imageData)
{
    int width = 1920;
    int height = 1080;
    
    // 创建对应格式的WriteableBitmap
    using var writeableBitmap = new WriteableBitmap(
        new PixelSize(width, height),
        new Vector(96, 96),
        PixelFormat.Rgb565,
        AlphaFormat.Opaque);
    
    // 锁定缓冲区并写入像素数据
    using (var buffer = writeableBitmap.Lock())
    {
        Buffer.BlockCopy(imageData, 0, buffer.Address, 0, imageData.Length);
    }
    
    _tempImage = writeableBitmap;
}

内容的提问来源于stack exchange,提问作者ManuelKetisch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:43:36