При создании Image<>
...
gif = new Image<Rgba32>(400, 400);
... gif.Frames[0]
- это «прозрачная черная» рамка (значение RGBA каждого пикселя равно #00000000
).Дополнительные кадры, которые вы создаете в цикле for
и добавляете с помощью ...
gif.Frames.AddFrame(img.Frames[0]);
..., становятся gif.Frames[1]
- gif.Frames[10]
, всего 11 кадров.
Кодер GIF использует GifColorTableMode
, чтобы решить, генерируется ли таблица цветов для каждого кадра или таблица цветов для первого кадра используется для всех кадров.Комбинация значения по умолчанию, GifColorTableMode.Global
, плюс этот первый прозрачный кадр приводит к 11-кадровому файлу .gif
только с одним цветом, тем же «прозрачным черным».Вот почему ваш желтый текст не появляется, и каждый кадр выглядит одинаково.
Чтобы решить эту проблему, в какой-то момент перед сохранением файла вам нужно удалить этот исходный прозрачный кадр, чтобы он не влиял на цветв любом случае, потому что это не является частью вашей анимации ...
gif.Frames.RemoveFrame(0);
Возможно, вы также захотите изменить на GifColorTableMode.Local
, чтобы ваш файл .gif
содержал таблицы цветов, отражающие все отображаемые цвета...
gif.MetaData.GetFormatMetaData(GifFormat.Instance).ColorTableMode = GifColorTableMode.Local;
... хотя каждый из 10 кадров использует почти одинаковый набор цветов, поэтому, если размер файла важнее, чем представление цвета, вы можете оставить это свойство в покое.Генерация вашей анимации 400 × 400 с GifColorTableMode.Global
создает файл 9,835 байт , тогда как GifColorTableMode.Local
создает файл 16,703 байт ; 70% больше, но я не могу отличить их между собой.
Проблема, связанная с GitHub
Кстати, так как я нашел этопопутно, если вы хотите изменить продолжительность анимированных кадров, вы должны сделать это, используя другой метод GetFormatMetaData()
, аналогичный показанному выше ...
GifFrameMetaData frameMetaData = img.MetaData.GetFormatMetaData(GifFormat.Instance);
frameMetaData.FrameDelay = 100;// 1 second