压缩内存流但保持为流(不创建文件)?

时间:2011-06-06 15:33:42

标签: c# compression

对于我的应用程序,我需要上传一个压缩的tif图像。需要注意的是,tif是从web服务下载到MemoryStream的,我试图避免写入硬盘。压缩此MemoryStream并将结果数据复制到另一个流(特别是HttpWebRequest的请求流)而不将任何文件保存到磁盘的最佳方法是什么?

压缩到位也是理想的...这些tif图像通常是200多MB,我宁愿没有图像,如果完全可以避免的话,它会同时存储在内存中。如果不可避免,我或许可以处理它。

3 个答案:

答案 0 :(得分:1)

你看过GZipStream了吗?这应该能够处理你的大多数问题。

请参阅:http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx

答案 1 :(得分:1)

以下是我在VB.NET应用程序中使用的内容......这在内存中都有效。

Imports System
Imports System.Collections.Generic
Imports System.IO.Compression
Imports System.IO
Imports System.Collections

Namespace Utilities

    Class Compression

        Public Shared Function Compress(ByVal data As Byte()) As Byte()
            Dim ms As New MemoryStream()
            Dim ds As New DeflateStream(ms, CompressionMode.Compress)
            ds.Write(data, 0, data.Length)
            ds.Flush()
            ds.Close()
            Return ms.ToArray()
        End Function


        Public Shared Function Decompress(ByVal data() As Byte) As Byte()
            Try

                'Copy the data (compressed) into ms.
                Using ms As New MemoryStream(data)
                    Using zipStream As Stream = New DeflateStream(ms, CompressionMode.Decompress, True)
                        'Decompressing using data stored in ms.
                        'zipStream = New DeflateStream(ms, CompressionMode.Decompress, True)
                        'Used to store the decompressed data.
                        Dim dc_data As Byte()
                        'The decompressed data is stored in zipStream; 
                        ' extract them out into a byte array.
                        dc_data = RetrieveBytesFromStream(zipStream, data.Length)
                        Return dc_data
                    End Using
                End Using
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
            End Try
        End Function

        Public Shared Function RetrieveBytesFromStream( _
       ByVal stream As Stream, ByVal bytesblock As Integer) As Byte()

            'Retrieve the bytes from a stream object.
            Dim data() As Byte
            Dim totalCount As Integer = 0
            Try
                While True
                    'Progressively increase the size of the data byte array.
                    ReDim Preserve data(totalCount + bytesblock)
                    Dim bytesRead As Integer = stream.Read(data, totalCount, bytesblock)
                    If bytesRead = 0 Then
                        Exit While
                    End If
                    totalCount += bytesRead
                End While
                'Make sure the byte array contains exactly the number
                'of bytes extracted.
                ReDim Preserve data(totalCount - 1)
                Return data
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
            End Try

        End Function

    End Class
End Namespace

答案 2 :(得分:0)

我也在使用Memory流,这就是我正在做的压缩/压缩它并通过n / w发送它。

MemoryStream st = new MemoryStream();
GZipStream zs = new GZipStream(st, CompressionMode.Compress);

zs.Write(dataSetResp.Response, 0, dataSetResp.Response.Length);
byte[] tmp = st.GetBuffer();

zs.Close();