Редактирование архивных файлов (изображений) в памяти

#vb.net #gdi #zipfile

#vb.net #gdi #zip

Вопрос:

Я не уверен, что я делаю не так с приведенным ниже примером кода.

Я не получаю никаких ошибок, и изображение выглядит так после применения сжатия:

     Using _stm = _ZipArchiveEntry.Open
        Dim _ims = New MemoryStream
        Image.FromStream(_stm, True, True).Save(_ims, _codec, params)
        _stm.Seek(0, SeekOrigin.Begin)
        _stm.SetLength(_ims.Length)
        _ims.CopyTo(_stm)
    End Using
  

Поврежденное изображение

ПРИМЕЧАНИЕ: если я записываю изображение на диск, оно работает. Я бы хотел избежать удаления и повторной вставки записей zip-архива.

 Using _stm = _ZipArchiveEntry.Open
    Image.FromStream(_stm, True, True).Save("C:test.jpeg", _codec, params)
End Using
  

Изображение, записанное на диск

Комментарии:

1. Можете ли вы сохранить поток памяти «_ims» на диск и сравнить файл с тем, который вы сохраняете непосредственно во втором примере?

2. Я понял это. Я забыл сбросить позицию в _ims обратно на 0.

Ответ №1:

Я забыл сбросить позицию потока «_ims» обратно на 0. Печальная часть, я предположил.CopyTo() сделал бы это за меня. Так что это было последнее, что я действительно проверил…

Это сработало:

     Using _stm = p_ZipArchiveEntry.Open
        Using _ims As New MemoryStream
            Image.FromStream(_stm, True, True).Save(_ims, _codec, params)
            _stm.SetLength(_ims.Length)
            _stm.Seek(0, SeekOrigin.Begin)
            _ims.Seek(0, SeekOrigin.Begin)
            _ims.CopyTo(_stm)
        End Using
    End Using