如何在WinRT中将画布集合转换为动画gif

How do I convert a collection of canvases into an animated gif in WinRT?

本文关键字:集合 转换 gif 动画 布集合 WinRT      更新时间:2023-09-26

我有一个javascript Windows 8应用程序,需要将一堆画布转换为动画gif。到目前为止,我拥有的是:

我可以将一个画布转换为base64编码的png,如下所示(在javascript中):

var base64png = myCanvas.toDataURL()

然后我可以将这个编码的图像转换成一个字节数组(在c#类库中):

private byte[] GetBytesFromBase64(string base64)
{
    string data = base64.Split(',')[1]; // get everything after comma
    return Convert.FromBase64String(data);
}

然后,我可以使用这些字节创建一个gif,并将其保存在磁盘上(同样,在c#类库中):

public async void ConvertToGif(string image)
    {
        // Note: The following line includes methods not shown in the question, but they work
        IRandomAccessStream stream = await ConvertToRandomAccessStream(
                                           ConvertToMemoryStream(
                                           GetBytesFromBase64(image)));
        var decoder = await BitmapDecoder.CreateAsync(stream);
        var pixels = await decoder.GetPixelDataAsync();
        var file = await KnownFolders.PicturesLibrary.CreateFileAsync("test.gif", CreationCollisionOption.ReplaceExisting);
        var outStream = await file.OpenAsync(FileAccessMode.ReadWrite);
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.GifEncoderId, outStream);
        encoder.SetPixelData(
            decoder.BitmapPixelFormat, 
            BitmapAlphaMode.Ignore,
            decoder.PixelWidth, 
            decoder.PixelHeight,
            decoder.DpiX, 
            decoder.DpiY,
            ReplaceTransparentWithWhite(pixels));

        await encoder.FlushAsync();
        outStream.Dispose();
    }

然而,这只会将一个画布保存为一个gif。如何将框架添加到gif?System.Media.Imaging命名空间中有一个GifEncoder类,但它似乎没有包含在WinRT.Net框架中。如有任何帮助,我们将不胜感激。

我建议你自己构建它,因为你已经有了将Canvas转换为单个GIF文件的代码。基本上,一个动画GIF只是一个容器GIF文件中的一系列GIF文件。虽然规范有点冗长,但您应该会发现.NET 1.1版中的这个示例非常有用。

尽管标准文件格式不直接允许动画,但允许通过"扩展名"进行动画制作。详细信息在这个维基百科页面上有很好的记录。

你需要做的核心是为文件写一个自定义的头块,然后为每个动画GIF帧写单独的流。