【问题标题】:Get raw data back from instance of Image从 Image 实例取回原始数据
【发布时间】:2010-02-20 14:31:42
【问题描述】:

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

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

【问题讨论】:

    标签: c# image


    【解决方案1】:

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

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

    那么你就不会再遇到关闭流的问题了,因为没关系。

    处理寻找新位置的位是因为某些图像格式是以非顺序方式编写的。如果底层流不支持它,它就不会工作,但那无论如何也不会工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2014-08-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多