我有一个不可搜索的流,其中包含PNG文件。我想使用WPF的BitmapDecoder
类解码它。文档没有声明我必须传递一个可搜索的流,如果我这样做,代码也不会抛出,所以我认为它应该有效。
然而,我无法让它发挥作用。这是一个显示问题的人为例子:
// This is an 8x8 all-red PNG:
var bytes = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLb"
+ "SncAAAAEElEQVQIHWP8z4AdMA4tCQB8/QgBp6L0HwAAAABJRU5ErkJggg==");
BitmapDecoder decoder;
using (var stream = new MemoryStream(bytes))
decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
Console.WriteLine(decoder.Frames[0].PixelWidth); // outputs 8, correctly
using (var stream = new UnseekableStream(new MemoryStream(bytes)))
decoder = BitmapDecoder.Create(stream, BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
Console.WriteLine(decoder.Frames[0].PixelWidth); // outputs 1, wrongly
documentation表示如果我传入OnLoad
标记,我应该立即处理该流。
当然我可以先将整个事情读成MemoryStream
,但这听起来不对。我做错了什么,或者BitmapDecoder
在这里有错误吗?
P.S。以下是上述示例中使用的UnseekableStream
的“压缩”来源:
public sealed class UnseekableStream : Stream
{
private Stream _stream;
public UnseekableStream(Stream underlyingStream) { _stream = underlyingStream; }
private bool _disposed = false;
protected override void Dispose(bool disposing)
{
if (_disposed) return;
_disposed = true; _stream.Dispose(); base.Dispose();
}
public override bool CanSeek { get { return false; } }
public override bool CanWrite { get { return _stream.CanWrite; } }
public override bool CanRead { get { return _stream.CanRead; } }
public override void Flush() { _stream.Flush(); }
public override long Length { get { return _stream.Length; } }
public override void SetLength(long value) { _stream.SetLength(value); }
public override long Position { get { return _stream.Position; } set { _stream.Position = value; } }
public override long Seek(long offset, SeekOrigin origin) { return _stream.Seek(offset, origin); }
public override int Read(byte[] buffer, int offset, int count) { return _stream.Read(buffer, offset, count); }
public override void Write(byte[] buffer, int offset, int count) { _stream.Write(buffer, offset, count); }
}
答案 0 :(得分:1)
您可以直接使用PngBitmapDecoder
:
using (var stream = new UnseekStream(new MemoryStream(bytes)))
{
decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
我想这个流只需要BitmapDecoder.Create
可以找到它,找出它所包含的图像格式,然后才能用合适的解码器对其进行解码。