− Скрыть
Да. В PascalABC.NET можно использовать встроенный в .NET класс GifBitmapEncoder из WPF. Внешние программы не нужны.
Понадобятся сборки:
PresentationCore
WindowsBase
Программа сначала сохраняет кадры во временные BMP, а затем объединяет их в один анимированный GIF:
uses
GraphABC,
System,
System.IO,
System.Collections.Generic,
System.Windows.Media.Imaging;
procedure CreateAnimatedGif(
frameFiles: sequence of string;
outputFile: string;
delay: word
);
begin
var encoder := new GifBitmapEncoder;
var firstFrame := true;
foreach var frameFile in frameFiles do
begin
var bitmap := new BitmapImage;
bitmap.BeginInit;
bitmap.CacheOption := BitmapCacheOption.OnLoad;
bitmap.UriSource := new Uri(frameFile, UriKind.Absolute);
bitmap.EndInit;
bitmap.Freeze;
var metadata := new BitmapMetadata('gif');
metadata.SetQuery('/grctlext/Delay', delay);
metadata.SetQuery('/grctlext/Disposal', byte(2));
if firstFrame then
begin
metadata.SetQuery('/appext/Application', 'NETSCAPE2.0');
metadata.SetQuery(
'/appext/Data',
new byte[]($03, $01, $00, $00)
);
firstFrame := false;
end;
var frame := BitmapFrame.Create(
bitmap,
bitmap.Thumbnail,
metadata,
bitmap.ColorContexts
);
encoder.Frames.Add(frame);
end;
var stream := new FileStream(
outputFile,
FileMode.Create,
FileAccess.Write
);
try
encoder.Save(stream);
finally
stream.Close;
end;
end;
begin
var text := 'Поезд чух чух!';
var x := 600;
var framesDirectory := Path.Combine(
Path.GetTempPath,
'PascalABC_Gif_' + Guid.NewGuid.ToString
);
Directory.CreateDirectory(framesDirectory);
SetWindowSize(600, 300);
CenterWindow;
SetFontSize(75);
var frameFiles := new List<string>;
LockDrawing;
for var i := 0 to 99 do
begin
ClearWindow(clWhite);
TextOut(x, 100, text);
Redraw;
var frameFile := Path.Combine(
framesDirectory,
'frame' + i.ToString('D3') + '.bmp'
);
SaveWindow(frameFile);
frameFiles.Add(frameFile);
x -= 10;
end;
UnlockDrawing;
CreateAnimatedGif(
frameFiles,
Path.GetFullPath('train.gif'),
2
);
Directory.Delete(framesDirectory, true);
Writeln('Создан файл:');
Writeln(Path.GetFullPath('train.gif'));
end.
Параметр delay задаётся в сотых долях секунды:
CreateAnimatedGif(frameFiles, 'train.gif', 2);
означает задержку 2 × 10 = 20 мс.
Для более плавного и не слишком быстрого движения можно использовать:
CreateAnimatedGif(frameFiles, 'train.gif', 5);
Это будет 50 мс на кадр, то есть примерно 20 кадров в секунду.
Если PascalABC.NET сообщает, что не найдены классы GifBitmapEncoder, BitmapImage или BitmapMetadata, нужно добавить ссылки на PresentationCore.dll и WindowsBase.dll в настройках проекта.