imagesharp пытается сделать анимированный GIF, который рассчитывает от 0 до 9 - PullRequest
0 голосов
/ 25 июня 2019

кто-нибудь может сказать мне, почему это генерирует анимированный GIF только для черного?

код также выводит каждый из них в память, генерируемую GIF, чтобы показать, что они разные

    public static void Test()
    {
        Image<Rgba32> img = null;
        Image<Rgba32> gif = null;

        TextGraphicsOptions textGraphicsOptions = new TextGraphicsOptions(true);
        SolidBrush<Rgba32> brushYellow = new SolidBrush<Rgba32>(Rgba32.Yellow);

        FontCollection fonts = new FontCollection();
        fonts.Install(fontLocation);
        Font font = fonts.CreateFont("Liberation Mono", PngFontHeight, FontStyle.Regular);


        gif = new Image<Rgba32>(400, 400);
        for (int i = 0; i < 10;++i)
        {
            img = new Image<Rgba32>(400, 400);
            img.Mutate(x => x.Fill(Rgba32.Black));
            img.Mutate(x => x.DrawText(textGraphicsOptions, i.ToString(), font, brushYellow, new PointF(1,1)));

            gif.Frames.AddFrame(img.Frames[0]);


            using (FileStream fs = File.Create(Path.Join(Program.workingDirectory, string.Format("Test-{0}.gif", i))))
            {
                img.SaveAsGif(fs);
            }

            img.Dispose();
        }

        using (FileStream fs = File.Create(Path.Join(Program.workingDirectory, "Test.gif")))
        {
            gif.SaveAsGif(fs);
        }
    }

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

Я хочу создать анимированный GIF-файл только в памяти.

1 Ответ

2 голосов
/ 27 июня 2019

При создании 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
...