【发布时间】:2010-02-20 14:31:42
【问题描述】:
我从资源中获取 Image(实际上是 Bitmap 类的实例),并且(将其写入 rtf 流) - 我需要它的原始数据。
另外,不能使用 Image.Save 方法,因为它似乎关闭了它保存到的流,我需要附加到 RTF 文件。由于性能问题,我不想创建新流,将图像保存到其中,然后将其复制到 RTF 流。
【问题讨论】:
我从资源中获取 Image(实际上是 Bitmap 类的实例),并且(将其写入 rtf 流) - 我需要它的原始数据。
另外,不能使用 Image.Save 方法,因为它似乎关闭了它保存到的流,我需要附加到 RTF 文件。由于性能问题,我不想创建新流,将图像保存到其中,然后将其复制到 RTF 流。
【问题讨论】:
创建一个过滤器流,该过滤器流传递到您要附加到的流,但在它本身关闭时不会关闭该流:
public class AppendingStream : Stream
{
private readonly long _startPos;
private readonly Stream _sink;
public AppendingStream(Stream sink)
{
if(sink == null)
throw new ArgumentNullException();
if(!sink.CanWrite)
throw new ArgumentException();
_sink = sink;
try
{
_startPos = sink.Position;
}
catch(NotSupportedException)
{
_startPos = -1;
}
}
public override bool CanRead
{
get
{
return false;
}
}
public override bool CanSeek
{
get
{
return _sink.CanSeek && _startPos != -1;
}
}
public override bool CanTimeout
{
get
{
return _sink.CanTimeout;
}
}
public override bool CanWrite
{
get
{
return true;
}
}
public override long Length
{
get
{
if(_startPos == -1)
throw new NotSupportedException();
return _sink.Length - _startPos;
}
}
public override long Position
{
get
{
return _sink.Position - _startPos;
}
set
{
_sink.Position = value + _startPos;
}
}
public override void Flush()
{
_sink.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
throw new NotSupportedException();
}
public override int ReadByte()
{
throw new NotSupportedException();
}
public override long Seek(long offset, SeekOrigin origin)
{
if(origin == SeekOrigin.Begin)
return _sink.Seek(offset + _startPos, SeekOrigin.Begin) - _startPos;
else
return _sink.Seek(offset, origin);
}
public override void SetLength(long value)
{
if(_startPos == -1)
throw new NotSupportedException();
_sink.SetLength(value + _startPos);
}
public override void Write(byte[] buffer, int offset, int count)
{
_sink.Write(buffer, offset, count);
}
public override void WriteByte(byte value)
{
_sink.WriteByte(value);
}
}
那么你就不会再遇到关闭流的问题了,因为没关系。
处理寻找新位置的位是因为某些图像格式是以非顺序方式编写的。如果底层流不支持它,它就不会工作,但那无论如何也不会工作。
【讨论】: