Когда вы загружаете свое изображение из Stream
, .NET Framework обнаруживает, что GIF является анимированным. Поскольку он знает, что не сможет перекодировать анимированный GIF, он пытается сохранить исходную кодировку GIF. Но это происходит после , когда он прочитал поток и декодировал GIF. Поэтому, когда он пытается перемотать поток, это терпит неудачу, и в итоге он не сохраняет оригинал.
При вызове Save()
сначала проверяется, сохранена ли исходная кодировка. Но так как эта операция не удалась, он пытается перекодировать GIF. Поскольку .NET не имеет кодировщика для анимированных GIF-файлов, он кодирует только первый кадр.
Если вы используете FileStream
вместо этого, он работает, поскольку FileStream
можно искать.
Вы можете заставить свой код работать, сначала загрузив ответ в MemoryStream:
// ...
Stream stream = httpWebReponse.GetResponseStream();
MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Position = 0;
stream = memoryStream;
Image img = Image.FromStream(stream);
// ...
Если вы хотите увидеть, что происходит, включите отладку эталонного источника .NET и обратите внимание, что происходит в Image.EnsureSave (). Вы также заметите, что реализация Image уже копирует Stream в MemoryStream, чтобы они могли решить эту проблему, используя его вместо исходного Stream.