簡體   English   中英

從Image實例中獲取原始數據

[英]Get raw data back from instance of Image

我從資源獲取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);
    }
}

然后你就不再有關閉流的問題,因為它沒關系。

處理尋找新位置的位是因為某些圖像格式是以非順序方式寫入的。 如果底層流不支持它,它將無法工作,但無論如何這將無法工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM