将多页图像转换为反向动画GIF - WinForms c#

本教程展示了如何在WinForms c#应用程序中使用LEADTOOLS SDK加载多页图像,反转其页面顺序,并将文件导出为动画GIF。

概述
总结 本教程介绍了如何在WinForms c#应用程序中反转多页图像并将它们导出为动画GIF图像。
完成时间 45分钟
Visual Studio项目 下载教程项目(5kb)
平台 Windows WinForms c#应用程序
IDE Visual Studio 2022
开发许可 下载LEADTOOLS
用另一种语言试试

所需的知识

步骤熟悉创建项目的基本步骤添加引用和设置License教程,在工作之前将多页图像转换为反向动画GIF - WinForms c#教程。

同时回顾在图像查看器中显示图像关于WinForms菜单和事件的详细操作教程。

创建项目并添加LEADTOOLS引用

中创建的项目的副本开始添加引用和设置License教程。如果您没有该项目,请按照该教程中的步骤创建它。

所需要的参考资料取决于项目的目的。引用可以通过以下两种方法中的一种添加(但不能同时添加)。

如果使用NuGet引用,本教程需要以下NuGet包:

如果使用本地DLL引用,则需要以下DLL。

dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \净

有关应用程序需要哪些DLL文件的完整列表,请参阅你的申请中包含的文件

设置License文件

许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License

有两种类型的运行时许可证:

请注意

中详细介绍了添加LEADTOOLS NuGet和本地引用以及设置许可添加引用和设置License教程。

初始化图片框控件

随着项目的创建、引用的添加和许可的设置,编码就可以开始了。

解决方案资源管理器,双击Form1.cs在设计器中显示。单击事件图标。属性窗口.然后,双击负载事件来创建事件处理程序(如果不存在)。这将显示表单后面的代码。

添加使用下面的语句到顶部。

c#
//在顶部使用块使用系统;使用先;使用System.Drawing;使用System.Windows.Forms;使用Leadtools;使用Leadtools.Controls;使用Leadtools.Codecs;使用Leadtools.Drawing;

属性中添加以下全局变量形式类。

c#
私人RasterPictureBox _pictureBox;RasterImage _forwardImage =RasterImage _rever沉淀物=CodecsImageInfo _imageInfo;

控件中添加以下代码Form1_Load事件处理程序来初始化RasterPictureBox对象。

c#
私人无效Form1_Load (对象发送者,EventArgs_pictureBox =RasterPictureBox ();_pictureBox。SizeMode = RasterPictureBoxSizeMode.Fit;_pictureBox。AutoDisposeImage =RasterPaintProperties = _pictureBox.PaintProperties;paintProperties。PaintEngine = RasterPaintEngine.GdiPlus;_pictureBox。PaintProperties = PaintProperties;_pictureBox。Dock = DockStyle.Fill;_pictureBox。BackColor = color .深灰色;Controls.Add (_pictureBox);_pictureBox.BringToFront ();

添加代码加载和动画文件

开放Form1.cs解决方案资源管理器.去工具箱并双击MenuStrip,它将向表单添加一个菜单。添加一个文件下拉菜单。确保下拉菜单的文本为文件.在文件下拉,添加一个新的子菜单,附文字状态.保留新项目的名称为openToolStripMenuItem

双击开放菜单项来创建其事件处理程序。

将以下代码添加到openToolStripMenuItem_Click事件处理程序来加载输入文件。

c#
私人无效openToolStripMenuItem_Click (对象发送者,EventArgs试一试使用(RasterCodecs codecs =RasterCodecs ())OpenFileDialog dlg =OpenFileDialog ();了解地理。过滤器="GIF图像|*. GIF |所有文件|*.*"如果(了解。ShowDialog () == dialgresult . ok)var信息= codecs.GetInformation(dg . filename,真正的);如果(信息。TotalPages < 2)对话框。显示(“文件没有多帧。不加载”。);返回_imageInfo = info;varloadedImage = codecs.Load(dlg。文件Name, 0, CodecsLoadByteOrder.BgrOrGray, 1, -1);AnimateAndReverse (loadedImage);_pictureBox。Image = _forwardImage;_pictureBox.StopAnimation ();(异常交货)MessageBox.Show (ex.ToString ());

属性中添加三个新方法Form1类命名SetGifProperties (RasterImage图片)FlattenAndReverse (RasterImage inputImage),AnimateAndReverse (RasterImage originalImage之下).调用AnimateAndReverse ()方法中的openToolStripMenuItem_Click事件处理程序,如上所示。调用SetGifProperties ()FlattenAndReverse ()方法。AnimateAndReverse ()方法,如下所示。

将以下代码添加到各自的方法中,如果加载的图像还没有动画,则可以对其进行动画,并创建动画图像的反向扁平副本。

c#
私人无效AnimateAndReverse (RasterImage originalImage之下)intI = 1;i <= originalImage.PageCount;我+ +)originalImage之下。Page = i;//如果帧没有延时,添加一个默认值如果(originalImage之下。动画Delay == 0)originalImage之下。动画Delay = 50;//如果原始图像没有动画,保存然后加载GIF动画如果(_imageInfo.Gif.HasAnimationLoop !)originalImage = SetGifProperties(originalImage);_forwardImage = originalImage;_forwardImage。Page = 1;vartmpImage = flatandreverse (originalImage);_rever沉淀物= SetGifProperties(tmpImage);
c#
私人SetGifProperties(光栅图像)使用(RasterCodecs codecs =RasterCodecs ())//保存为GIF并重新加载以方便设置动画属性MemoryStream ms =MemoryStream ();的形象。Page = 1;编解码器。Save(image, ms, RasterImageFormat.Gif, 8);ms.Position = 0;_imageInfo =编解码器。GetInformation(女士,真正的);图像=编解码器。负载(ms, 24, CodecsLoadByteOrder.BgrOrGray, 1, -1);ms.Dispose ();返回形象;
c#
私人RasterImage inputImageintw = inputImage.AnimationGlobalSize。宽度,h = inputImage.AnimationGlobalSize.Height;如果(w <= 0)w = inputImage.Width;如果(h <= 0)h = inputImage.Height;RasterImage renderImage =RasterImage (RasterMemoryFlags。传统的,w,h,inputImage。BitsPerPixel,inputImage。订单,inputImage。ViewPerspective,IntPtr。零,0);//从动画图像复制调色板到这个新创建的图像inputImage.CopyPaletteTo (renderImage);RasterImage flatImage =//创建RasterImageAnimator对象RasterImageAnimator _animator =RasterImageAnimator (renderImage inputImage);//动画化,并以相反的顺序保存帧//使用GDI+油漆引擎支持透明颜色RasterPaintProperties props = _pictureBox.PaintProperties;道具。PaintEngine = RasterPaintEngine.GdiPlus;使用(RasterImageGdiPlusGraphicsContainer _gdiPlusGraphics =RasterImageGdiPlusGraphicsContainer (renderImage))图形g = _gdiPlusGraphics.Graphics;RasterImageAnimatorState状态;保龄球做=(!)LeadRect srcRect =LeadRect(0,0, renderImage.)ImageWidth renderImage.ImageHeight);LeadRect updateRect;LeadRect destRect;state = _animation . process ();开关(状态)情况下RasterImageAnimatorState。WaitDelay:情况下RasterImageAnimatorState。WaitInputDelay://设置动画延迟到插入的最后一帧flatImage。动画Delay = _animator.Delay;_animator.CancelWait ();打破情况下RasterImageAnimatorState。呈现:打破情况下RasterImageAnimatorState。WaitInput://如果动画图像有“等待用户输入”标志,//取消等待_animator.CancelWait ();打破情况下RasterImageAnimatorState。PostRender://获取目标图像中发生变化的区域updat勃起= _animator。GetUpdateRectangle (真正的);destRect =LeadRect(0,0, renderImage.)ImageWidth renderImage.ImageHeight);//绘制RasterImagePainter。绘制(renderImage, g, srcRect, updat勃起,destRect, destRect, props);如果(flatImage = =flatImage = renderImage.Clone();其他的flatImage。在sertPage(0, renderImage.Clone());//在开始位置插入以反转帧flatImage。Page = 1;//新插入的帧总是编号1flatImage。动画Delay = 50;//如果动画没有提供值,请设置。打破情况下RasterImageAnimatorState。结束:做=真正的//一旦动画完成,就存在循环打破默认的打破返回flatImage;

添加保存反转图像代码

导航回表单设计师,使用解决方案资源管理器.添加一个新的并保存了子菜单文件下拉菜单。保留新项目的名称为saveReversedToolStripMenuItem

双击并保存了菜单项来创建它的事件处理程序,然后在其中添加以下代码以导出动画GIF。

c#
私人无效saveReversedToolStripMenuItem_Click (对象发送者,EventArgs如果(_reversedImage = =对话框。显示(“救不了!”请先加载图像”);返回试一试SaveFileDialog saveDlg =SaveFileDialog ();saveDlg。过滤器=“GIF图像| * GIF”如果(saveDlg。ShowDialog () != dialgresult . ok)返回使用(RasterCodecs codecs =RasterCodecs ())codecs.Save (_pictureBox。形象,saveDlg。文件Name, RasterImageFormat.Gif, 8);(异常交货)MessageBox.Show (ex.ToString ());

添加动画回放代码

开放Form1.cs解决方案资源管理器.添加一个新的下拉菜单,动画,在文件下拉菜单。添加以下三个子菜单到新的下拉菜单:

项文本 物品的名称
打前锋 playForwardToolStripMenuItem
玩逆转 playReversedToolStripMenuItem
和停止 stopToolStripMenuItem

双击这三个新项目中的每一个,为它们添加事件处理程序,并按如下方式实现它们:

c#
私人无效playForwardToolStripMenuItem_Click (对象发送者,EventArgs如果(_forwardImage = =对话框。显示(“无法播放动画!请先加载图像”);返回_pictureBox。Image = _forwardImage;_pictureBox。动画Mode = RasterPictureBoxAnimationMode.Infinite;_pictureBox.PlayAnimation ();
c#
私人无效playReversedToolStripMenuItem_Click (对象发送者,EventArgs如果(_reversedImage = =对话框。显示(“无法播放动画!请先加载图像”);返回_pictureBox。Image = _rever沉淀物;_pictureBox。动画Mode = RasterPictureBoxAnimationMode.Infinite;_pictureBox.PlayAnimation ();
c#
私人无效stopToolStripMenuItem_Click (对象发送者,EventArgs_pictureBox.StopAnimation ();

运行项目

按下运行项目F5,或选择Debug ->开始调试

如果正确地遵循了这些步骤,应用程序将运行并加载用户选择的任何多页图像,确保它是动画的,并创建图像的向后动画副本。它还允许将反向动画图像保存到一个新的GIF文件,并播放正向和反向动画。

加载GIF的截图。

总结

本教程展示了如何添加必要的引用来加载、反转、回放和保存动画图像。此外,还展示了如何使用RasterPictureBoxRasterImageAnimator类。

另请参阅

iOS
188金宝搏的网址客服|支持|联系我们|知识产权公告
©1991 - 2023领德科技有限公司版权所有。