0

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

我可以像这样(在 javascript 中)将一个画布转换为 base64 编码的 png:

var base64png = myCanvas.toDataURL()

然后我可以将此编码图像转换为字节数组(在 ac# 类库中):

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 中添加帧?命名空间中有一个GifEncoderSystem.Media.Imaging,但它似乎不包含在 WinRT .Net 框架中。任何帮助,将不胜感激。

4

1 回答 1

1

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

虽然标准文件格式不直接允许动画,但通过“扩展”动画是允许的。详细信息在Wikipedia 页面上有详细记录。

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

于 2013-09-01T15:49:50.417 回答