Подтвердить что ты не робот

С# gif Image to MemoryStream и обратно (потерять анимацию)

У меня небольшая проблема, и я не нашел никаких решений. Я хочу преобразовать GIF в байт [], а затем вернуться в GIF. Я отлично работаю, но я теряю анимацию.

Это отличный анимированный GIF, когда я начинаю (я показываю его в элементе PictureBox). Но после преобразования я застреваю в первом кадре.

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("creativetechs.com/i/tip_images/ExampleAnimation.gif");
HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = httpWebReponse.GetResponseStream();
Image img = Image.FromStream(stream);

MemoryStream ms = new MemoryStream();
img.Save(ms,img.RawFormat);
byte [] bytes = ms.ToArray();
Image img2 = Image.FromStream(new MemoryStream(bytes));

int frames1 = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);
int frames2 = img2.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time);

Я также пытался использовать RawFormat, но System.Drawing.Imaging.ImageFormat.Gif. Ничего не изменил. frames1 - правильное количество кадров. frames2 равно 1.

У меня есть 2 PictureBox элементов в моем графическом интерфейсе. Один показывает img, а другой img2. Но img2 не анимируется, а img есть. Что не так?

Я также попытался использовать сериализацию, чтобы создать свой байт [].

Я сериализовал изображение и снова десериализовал его, и он ничего не изменил. Как это возможно?

4b9b3361

Ответ 1

При загрузке изображения с Stream платформа .NET обнаруживает, что GIF анимирован. Поскольку он знает, что он не сможет перекодировать анимированный GIF, он пытается сохранить исходную кодировку GIF. Но это происходит после того, как он прочитал поток и расшифровал GIF. Поэтому, когда он пытается перемотать поток, это терпит неудачу, и он не сохраняет оригинал.

Когда вы вызываете Save(), он сначала проверяет, хранится ли исходная кодировка. Но поскольку эта операция не удалась, она пытается переустановить GIF. Так как .NET не имеет кодировщика для анимированных GIF, он кодирует только первый кадр.

Если вы используете FileStream, он работает, так как a 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, так что они могут исправить проблему, используя это вместо исходного потока.

Ответ 2

GDI + не содержит анимированный GIF-кодер (только декодер). Таким образом, ваш img.Save сбросит анимацию. Но вы можете попробовать следующее: http://www.codeproject.com/KB/GDI-plus/NGif.aspx