从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
相关产品推荐
相关产品推荐

