C# 如何在WinRT中将画布集合转换为动画gif?
我有一个javascript Windows 8应用程序,我需要将一堆画布转换成动画gif。以下是我目前掌握的情况: 我可以将一个画布转换为base64编码的png,如下所示(在javascript中):C# 如何在WinRT中将画布集合转换为动画gif?,c#,javascript,windows,windows-runtime,gif,C#,Javascript,Windows,Windows Runtime,Gif,我有一个javascript Windows 8应用程序,我需要将一堆画布转换成动画gif。以下是我目前掌握的情况: 我可以将一个画布转换为base64编码的png,如下所示(在javascript中): var base64png=myCanvas.toDataURL() 然后,我可以将此编码图像转换为字节数组(在c#类库中): 然后,我可以使用这些字节创建gif,并将其保存在磁盘上(同样,保存在c#类库中): 但是,这仅将一个画布保存为一个gif。如何将帧添加到gif?System.Medi
var base64png=myCanvas.toDataURL()
然后,我可以将此编码图像转换为字节数组(在c#类库中):
然后,我可以使用这些字节创建gif,并将其保存在磁盘上(同样,保存在c#类库中):
但是,这仅将一个画布保存为一个gif。如何将帧添加到gif?
System.Media.Imaging
命名空间中有一个GifEncoder
类,但它似乎未包含在WinRT.Net框架中。任何帮助都将不胜感激。我建议您自己构建它,因为您已经有了将画布转换为单个GIF文件的代码。基本上,动画GIF只是容器GIF文件中的一系列GIF文件。虽然规范有点冗长,但您应该发现从.NET1.1天开始非常有用
虽然标准文件格式不直接允许动画,但允许通过“扩展名”进行动画。这些细节在维基百科页面上有很好的记录
您需要做的核心是为文件编写一个自定义头块,然后为每个动画GIF帧编写单独的流
private byte[] GetBytesFromBase64(string base64)
{
string data = base64.Split(',')[1]; // get everything after comma
return Convert.FromBase64String(data);
}
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();
}