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

无法从已保存的XML文件中加载数据到WriteableBitmap变量

读取XML中保存的WriteableBitmap数据时出现“缓冲区大小不足”异常

数据结构

WriteableBitmap painter;
painter = new WriteableBitmap(
    pixelWidth: 100,
    pixelHeight: 100,
    dpiX: 96,
    dpiY: 96,
    pixelFormat: PixelFormats.Bgra32,
    palette: null);
byte[] sourcePixelData = new byte[] { 0, 0, 255, 255 };
Image image = new Image
{
    Source = painter,
    Width = painter.PixelWidth,
    Height = painter.PixelHeight
};

保存方式

using (FileStream fs = new FileStream(data.saveName, FileMode.Create))
using (XmlWriter writer = XmlWriter.Create(fs))
{
    // 其他代码...
    writer.WriteStartElement("itemSpecial");
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(painter));
    using (MemoryStream _ms = new MemoryStream())
    {
        encoder.Save(_ms);
        byte[] _imageBytes = _ms.ToArray();
        string _base64Image = Convert.ToBase64String(_imageBytes);
        writer.WriteStartElement("imageData");
        writer.WriteValue(_base64Image);
        writer.WriteEndElement();
    }
    writer.WriteEndElement();
    // 其他代码...
}

XML中的数据

<itemSpecial>
    <imageData>iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIbSURBVHhe7dmLcoMgEIXhtO//zm3WwIQQVEyAPej/TZ2oWC97BE17A7DhJ3xO42/5ebpfwHTXcBoWRhpIHg4GKwVg6wjGwV7RCWWgmmITyEC1xSaUAY4UmUA6O1pgAunskwITSiffFHbmUH7DJ0QQyA7rbTP3uCa+LUCrArbazxGn7CH2B0ePYrbAkIVtre7sb/fT6jyOoocUWBhe/2c5bSCzPkekAvG8M1UwZGW8bwoCEUMgCYUhUyYQnh8P9BAxBCKGQMQQiBgCCVReKghEDIHcKb1yE4gYiUD4Uvh0+R6idjMwZIkhEDHugfD8eEUPEUMgYlwDYbh6d+keonhDMGSJcQuE4aqMHiKGQPBgQ1aY7WJv/72P/6lL9RALIU5xeWlA/2Lk+19bts84LQ1XNOLi02PYfH7MfFnFqYesGIS9Xte8YquG1J3ChZfOQeG8XHhf+Nbxvc+N7yFiCCRjzxrPXnK5QKzYNQ94L8MDUS+IN4YsMQQiZmggDFf7pu0hFm5pCs2o0bJga/uy9XEKq16srU/VbNPLsB4y6iJtSJx5WJz2xNcCTsNIt4nrbV26TUnNNlNLC9OLHSOfQtPL8dP5kr323k7z2lu6o624NllbnA9NRXvtI5yyW1phY0BHihx/B42VQrB1R8JBY2vFVw/l1F00LX4+hDE8ObMg4hSXlwb4S4MBAAAAAAAAAAAAAAAAAAAAgHe32z/UyfWrWv086AAAAABJRU5ErkJggg==</imageData>
</itemSpecial>

读取方式

byte[] _imageData = {0};
using (XmlReader reader = XmlReader.Create(data.loadName))
{
    while (reader.Read())
    {
        // 其他代码...
        if (reader.Name == "imageData")
        {
            _imageData = Convert.FromBase64String(_str);
        }
        // 其他代码...
        WriteableBitmap painter = new WriteableBitmap(100,100,96,96,System.Windows.Media.PixelFormats.Bgra32,null);
        var stride = (100 * painter.Format.BitsPerPixel + 7) / 8;
        var bufferSize = 100 * stride;
        painter.WritePixels(new System.Windows.Int32Rect(0, 0, 100, 100), _imageData, bufferSize, 0);
        // 其他代码...
    }
}

问题

读取时抛出缓冲区大小不足异常,尝试过调整缓冲区大小(包括用公式计算stride、手动设置大数值)、重新保存XML文件,均无法解决。


解决方案

核心问题是:保存时把WriteableBitmap编码成了PNG格式的压缩字节流,但读取时直接将PNG字节流传给WritePixels——WritePixels需要的是未压缩的原始像素数据(比如Bgra32格式的逐像素字节),而非压缩后的PNG文件数据。

修改读取逻辑,先将Base64解码后的PNG字节流解码为BitmapSource,再转换为WriteableBitmap:

正确的读取代码

byte[] _imageData = {0};
using (XmlReader reader = XmlReader.Create(data.loadName))
{
    while (reader.Read())
    {
        // 其他代码...
        if (reader.Name == "imageData")
        {
            _imageData = Convert.FromBase64String(reader.Value);
        }
        // 其他代码...
        WriteableBitmap painter = null;
        using (MemoryStream ms = new MemoryStream(_imageData))
        {
            PngBitmapDecoder decoder = new PngBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
            BitmapFrame frame = decoder.Frames[0];
            painter = new WriteableBitmap(frame);
        }
        // 还原后的painter可直接绑定到Image控件
        Image image = new Image
        {
            Source = painter,
            Width = painter.PixelWidth,
            Height = painter.PixelHeight
        };
        // 其他代码...
    }
}

原因说明

  • 保存时通过PngBitmapEncoder生成的是压缩后的PNG文件字节(包含文件头、压缩像素数据等),长度远小于原始Bgra32像素数组的长度(1001004=40000字节)。
  • WritePixels要求传入的字节数组长度必须等于宽度 * stride,PNG字节流长度不满足要求,因此抛出缓冲区不足异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:24:55