如何在WinRT中将画布集合转换为动画gif
How do I convert a collection of canvases into an animated gif in WinRT?
我有一个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帧写单独的流。
相关文章:
- 将主干集合对象转换为其原始类型
- 将多级 mongodb 文档转换为 Backbone.js 模型/集合
- 如何将两个集合转换为一个集合
- 为单行添加下划线可将集合转换为对象的对象
- 尝试从MongoDB BsonArray转换为IEnumerable
POCO实例的集合时引发错误 - 如何在 JavaScript 中对对象集合进行排序,而不将其转换为数组
- 使用 lodash 转换集合
- 如何在WinRT中将画布集合转换为动画gif
- 将嵌套文档集合转换为具有父引用的模型树结构
- Javascript将集合转换为普通数组
- MongooseJS:如何将Mongoose集合转换为标准的Javascript数组
- 如何将对象转换为对象数组(或对象集合)
- d3如何将一组数字转换为代表第一组的较大集合
- 使用下划线转换集合的更好方法
- Backbonejs+MarionetteJD-将Backbone列表视图转换为MarionetteJS集合视图
- Backbone.js,require.js:我如何将我的模型、视图和集合转换为require.js模块
- 转换 jQuery 对象中的 lodash/underscore 集合(链接)
- 如何在主干中将数组转换为集合
- backbone.js集合从json文件转换为模板
- 将 HTML DOM 集合转换为数组