Заархивировать поток памяти, но сохранить как поток (не создавать файл)? - PullRequest
2 голосов
/ 06 июня 2011

Для моего приложения мне нужно загрузить сжатое изображение. Предостережение заключается в том, что tif загружается из веб-сервиса в MemoryStream, и я пытаюсь избежать записи на жесткий диск. Каков наилучший способ заархивировать этот MemoryStream и скопировать полученные данные в другой поток (в частности, поток запросов HttpWebRequest) без сохранения каких-либо файлов на диск?

Сжатие на месте также было бы идеальным ... Эти tif-изображения обычно имеют размер 200+ МБ, и я бы предпочел, чтобы изображение не было, и его размер был бы в памяти одновременно, если его вообще можно избежать. Если это неизбежно, я смогу справиться с этим.

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Вот то, что я использовал в приложении 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
1 голос
/ 06 июня 2011

Вы смотрели на GZipStream? Это должно быть в состоянии справиться с большинством ваших проблем.

См .: http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx

0 голосов
/ 03 апреля 2012

Я также использую поток памяти, и это то, что я делаю, чтобы сжать / сжать его и отправить по н / ж.

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...