2010-02-20 35 views
4

我从资源获取图像(实际上是位图类的实例),并且(将其写入rtf流) - 我需要原始数据。从图像实例获取原始数据

此外,Image.Save方法不能使用,因为它似乎关闭流保存到,我需要追加到RTF文件。我不想创建新的流,将图像保存到它,然后将其复制到RTF流,因为性能问题。

回答

3

创建通过您要附加到流通过一个过滤器流,但不会关闭该流时,它本身是封闭的:

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); 
    } 
} 

那么你已经不再有问题该流被关闭,因为它并不重要。

处理寻找新位置的位是因为某些图像格式是以非顺序方式写入的。如果底层的流不支持它,它将不起作用,但是那样不会起作用。

相关问题