Я играл с NGif Animator для изменения размера анимированных гифок, и он действительно изменяет размеры, но части во многих анимированных гифках, которые я пытался стереть.Я просмотрел комментарии на этой странице и не увидел, чтобы кто-то еще упомянул об этом.
Чтобы устранить изменение размера как причину, я просто перебираю кадры и сохраняю каждый из них.Каждый кадр является System.Drawing.Image.Прозрачность не установлена (Color.Empty).
В настоящее время это мой метод тестирования:
GifDecoder gifDecoder = new GifDecoder();
MemoryStream memoryStream = new MemoryStream();
new BinaryWriter((Stream)memoryStream).Write(imageToResize); // byte array
memoryStream.Position = 0L;
gifDecoder.Read((Stream)memoryStream);
memoryStream.Dispose();
string filename = Guid.NewGuid().ToString().Replace("-", String.Empty) + ".gif";
string output = path + @"\" + filename;
AnimatedGifEncoder animatedGifEncoder = new AnimatedGifEncoder();
animatedGifEncoder.Start(output);
animatedGifEncoder.SetRepeat(gifDecoder.GetLoopCount());
animatedGifEncoder.SetQuality(10); // They say 20 is max quality will get, I've tried higher. Makes it a little bit better but black areas instead of gray. 10 is their default.
animatedGifEncoder.SetTransparent(Color.Empty); // This is default either way
int frameCount = gifDecoder.GetFrameCount();
int num = 0;
Image frame;
Image image = null;
for (int index = frameCount; num < index; ++num)
{
frame = gifDecoder.GetFrame(num);
animatedGifEncoder.SetDelay(gifDecoder.GetDelay(num));
string fname = @"C:\Development\images\frame_" + num.ToString() + ".gif";
if (File.Exists(fname)) { File.Delete(fname); }
frame.Save(fname);
animatedGifEncoder.AddFrame(image);
}
animatedGifEncoder.Finish();
Вот пример того, что происходит:
Фон пропал и становится серым.
Он должен выглядеть следующим образом:
Каждый имеет опыт работы с NGif и знает, что может вызватьэтот?Первый кадр всегда в порядке.У других после этого возникла проблема, поэтому я предполагаю, что что-то не сбрасывается из кадра в кадр (или перечитывается).Я добавил больше вещей к их методу сброса фрейма, но пока это не помогло.Теперь это выглядит так:
protected void ResetFrame()
{
lastDispose = dispose;
lastRect = new Rectangle(ix, iy, iw, ih);
lastImage = image;
lastBgColor = bgColor;
delay = 0;
transparency = false; // I don't want transparency
lct = null;
act = null;
transIndex = -1;
}