Windows 8应用实例解析 - WinRT下创建GIF动画(Flipflop)

简介:

在Windows Store中下载了一个有意思的应用,叫做Flipflop(http://apps.microsoft.com/windows/app/flipflop/99c01512-fe4f-4d1a-872e-eb9fd6638ff4),该应用允许用户创建翻页式动画效果(Flipbook Animation), 并且可以导出动画为GIF文件。在MSDN看到一篇介绍该项目的技术文章,分享给大家。

Flipflop项目中,作者使用Windows Imaging Component(WIC)实现创建图片(MSDN查看Windows 8 WIC新特性),

在项目中引用Windows.Graphics命名空间,在该空间中包含BitmapEncoder类(MSDN),通过该类可以创建特定的图片编码,例如GifEncoder。

通过代码查看工具,可以看到作者创建一个共享类"GifMaker"实现动画帧的定义,

 


 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Runtime.InteropServices.WindowsRuntime; 
  4. using Windows.Foundation; 
  5. using Windows.Graphics.Imaging; 
  6. using Windows.Storage; 
  7.  
  8. namespace Utilities 
  9. { 
  10.     public sealed class GifMaker 
  11.     { 
  12.         readonly List<byte[]> frames = new List<byte[]>(); 
  13.         private readonly uint frameWidth; 
  14.         private readonly uint frameHeight; 
  15.  
  16.         public GifMaker(uint width, uint height) 
  17.         { 
  18.             frameWidth = width; 
  19.             frameHeight = height; 
  20.         } 
  21.  
  22.         public void AppendNewFrame([ReadOnlyArray]byte[] frame) 
  23.         { 
  24.             frames.Add(frame); 
  25.         } 

实现翻页式动画效果的关键是将多个单帧图片连接在一起,然后通过延时设置播放各个帧实现动画效果。

在BitmapEncoder类(MSDN)中,GoToNextFrameAsync()方法可实现在当前帧的基础上异步动态添加新的空白帧,而通过代码实现浏览各个单一图片,动态放入不同的空白帧中实现翻页动画效果。

 


 
 
  1. public IAsyncInfo GenerateAsync(StorageFile file) 
  2. { 
  3.     return AsyncInfo.Run(async ctx => 
  4.         { 
  5.             var outStream = await file.OpenAsync(FileAccessMode.ReadWrite); 
  6.  
  7.             var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.GifEncoderId, outStream); 
  8.  
  9.             for (int i = 0; i < frames.Count; i++) 
  10.             { 
  11.                 var pixels = frames[i]; 
  12.                 encoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Ignore, 
  13.                                      frameWidth, frameHeight, 
  14.                                      92.0, 92.0, 
  15.                                      pixels); 
  16.  
  17.                 if (i < frames.Count - 1) 
  18.                     await encoder.GoToNextFrameAsync(); 
  19.             } 
  20.  
  21.             await encoder.FlushAsync(); 
  22.             outStream.Dispose(); 
  23.         }); 
  24. } 

最后,需要设置播放帧延迟时间,以达到翻页动画效果。控制帧延迟的属性是encoder.BitmapProperties和“/grctlext/Delay”,代码如下:

 


 
 
  1. public IAsyncInfo GenerateAsync(StorageFile file, int delay) 
  2. { 
  3.     return AsyncInfo.Run(async ctx => 
  4.         { 
  5.             var outStream = await file.OpenAsync(FileAccessMode.ReadWrite); 
  6.  
  7.             var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.GifEncoderId, outStream); 
  8.  
  9.             for (int i = 0; i < frames.Count; i++) 
  10.             { 
  11.                 var pixels = frames[i]; 
  12.                 encoder.SetPixelData(BitmapPixelFormat.Rgba8, BitmapAlphaMode.Ignore, 
  13.                                      frameWidth, frameHeight, 
  14.                                      92.0, 92.0, 
  15.                                      pixels); 
  16.  
  17.                 if (i == 0) 
  18.                 { 
  19.                     var properties = new BitmapPropertySet 
  20.                         { 
  21.                             { 
  22.                                 "/grctlext/Delay", 
  23.                                 new BitmapTypedValue(delay / 10, PropertyType.UInt16) 
  24.                             } 
  25.                         }; 
  26.  
  27.                     await encoder.BitmapProperties.SetPropertiesAsync(properties); 
  28.                 } 
  29.  
  30.                 if (i < frames.Count - 1) 
  31.                     await encoder.GoToNextFrameAsync(); 
  32.             } 
  33.  
  34.             await encoder.FlushAsync(); 
  35.             outStream.Dispose(); 
  36.         }); 
  37. } 

如果你是使用JavaScript作为Windows store应用开发语言,可以使用以下代码实现以上相同的效果,

 


 
 
  1. var picker = new Windows.Storage.Pickers.FileSavePicker(); 
  2. picker.fileTypeChoices.insert("Gif files", [".gif"]); 
  3.  
  4. picker.pickSaveFileAsync().then(function(file) { 
  5.     if (!file) { 
  6.         return; 
  7.     } 
  8.     var gifMaker = new Utilities.GifMaker(800, 600); 
  9.  
  10.     for (var commandsIndex = 0; commandsIndex < currentFlipflop.pages.length; commandsIndex++) { 
  11.         // This code is used to retrieve canvases bytes 
  12.         var bytes = Flipflop.Tools.GetBytesfromFlipflop(currentFlipflop.pages[commandsIndex], 
  13.             800, 600); 
  14.  
  15.         gifMaker.appendNewFrame(bytes); 
  16.     } 
  17.  
  18.     gifMaker.generateAsync(file, 200).done(); 
  19. }); 

Flipflop产生GIF动画效果演示:

 

欢迎大家留言讨论学习Windows 8应用开发,希望能够看到更多优秀的Windows store应用。

欢迎大家加入QQ技术群,一起学习讨论Windows 8&Silverlight&WPF&Widnows Phone开发技术。 
22308706(一群) 超级群500人 
37891947(二群) 超级群500人 
100844510(三群) 高级群200人 
32679922(四群) 超级群500人 
23413513(五群) 高级群200人 
32679955(六群) 超级群500人 
88585140(八群) 超级群500人 
128043302(九群 企业应用开发推荐群) 高级群200人 
101364438(十群) 超级群500人


本文转自冷秋寒 51CTO博客,原文链接:http://blog.51cto.com/kevinfan/1148024 ,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 文字识别 监控
安全监控系统:技术架构与应用解析
该系统采用模块化设计,集成了行为识别、视频监控、人脸识别、危险区域检测、异常事件检测、日志追溯及消息推送等功能,并可选配OCR识别模块。基于深度学习与开源技术栈(如TensorFlow、OpenCV),系统具备高精度、低延迟特点,支持实时分析儿童行为、监测危险区域、识别异常事件,并将结果推送给教师或家长。同时兼容主流硬件,支持本地化推理与分布式处理,确保可靠性与扩展性,为幼儿园安全管理提供全面解决方案。
918 3
|
存储 缓存 负载均衡
阿里云服务器实例选择指南:热门实例性能、适用场景解析对比参考
2025年,在阿里云的活动中,主售的云服务器实例规格除了轻量应用服务器之外,还有经济型e、通用算力型u1、计算型c8i、通用型g8i、计算型c7、计算型c8y、通用型g7、通用型g8y、内存型r7、内存型r8y等,以满足不同用户的需求。然而,面对众多实例规格,用户往往感到困惑,不知道如何选择。本文旨在全面解析阿里云服务器实例的各种类型,包括经济型、通用算力型、计算型、通用型和内存型等,以供参考和选择。
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
1193 27
|
供应链 项目管理 容器
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
在当今快速变化的商业环境中,对象管理组织(OMG)推出了三种强大的建模标准:BPMN(业务流程模型和符号)、CMMN(案例管理模型和符号)和DMN(决策模型和符号)。它们分别适用于结构化流程管理、动态案例处理和规则驱动的决策制定,并能相互协作,覆盖更广泛的业务场景。BPMN通过直观符号绘制固定流程;CMMN灵活管理不确定的案例;DMN以表格形式定义清晰的决策规则。三者结合可优化企业效率与灵活性。 [阅读更多](https://example.com/blog)
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
1022 4
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
人工智能 自然语言处理 算法
DeepSeek大模型在客服系统中的应用场景解析
在数字化浪潮下,客户服务领域正经历深刻变革,AI技术成为提升服务效能与体验的关键。DeepSeek大模型凭借自然语言处理、语音交互及多模态技术,显著优化客服流程,提升用户满意度。它通过智能问答、多轮对话引导、多模态语音客服和情绪监测等功能,革新服务模式,实现高效应答与精准分析,推动人机协作,为企业和客户创造更大价值。
1271 5
|
存储 机器学习/深度学习 人工智能
阿里云服务器第八代通用型g8i实例评测:性能与适用场景解析
阿里云服务器通用型g8i实例怎么样?g8i实例采用CIPU+飞天技术架构,并搭载最新的Intel 第五代至强可扩展处理器(代号EMR),不仅性能得到大幅提升,同时还拥有AMX加持的AI能力增强,以及全球范围内率先支持的TDX机密虚拟机能力。这些特性使得g8i实例在AI增强和全面安全防护两大方面表现出色,尤其适用于在线音视频及AI相关应用。本文将深入探讨g8i实例的产品特性、优势、适用场景及规格族,以帮助您更好地了解这款产品,以供参考和选择。
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多
  • DNS