我在从之前保存的 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 的数据(这只是 100x100 像素图像下红色画笔的一些随机移动):
<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);
...
}
}
例外情况是:缓冲区大小不足。
我尝试过的:直接使用缓冲区大小进行播放。 (100 * Painter.Format.BitsPerPixel + 7) / 8 只是最后一个变体,我也尝试在这里放置数千个字节。我尝试重新保存新的 xml 文件,但没有成功。
base64 字符串包含编码的 PNG 帧,而不是原始像素缓冲区。为了从字符串创建 WriteableBitmap,ypu 必须首先解码 BitmapSource:
using (var ms = new MemoryStream(_imageData))
{
var frame = BitmapFrame.Create(ms,
BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
painter = new WriteableBitmap(frame);
}