本教程展示了如何在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菜单和事件的详细操作教程。
中创建的项目的副本开始添加引用和设置License教程。如果您没有该项目,请按照该教程中的步骤创建它。
所需要的参考资料取决于项目的目的。引用可以通过以下两种方法中的一种添加(但不能同时添加)。
如果使用NuGet引用,本教程需要以下NuGet包:
Leadtools.Viewer.Controls.WinForms如果使用本地DLL引用,则需要以下DLL。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \净:
Leadtools.dllLeadtools.Drawing.dllLeadtools.Controls.WinForms.dllLeadtools.Codecs.dllLeadtools.Codecs.Gif.dllLeadtools.Codecs.Tif.dll有关应用程序需要哪些DLL文件的完整列表,请参阅你的申请中包含的文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中详细介绍了添加LEADTOOLS NuGet和本地引用以及设置许可添加引用和设置License教程。
随着项目的创建、引用的添加和许可的设置,编码就可以开始了。
在解决方案资源管理器,双击Form1.cs在设计器中显示。单击事件图标。属性窗口.然后,双击负载事件来创建事件处理程序(如果不存在)。这将显示表单后面的代码。
添加使用下面的语句到顶部。
//在顶部使用块使用系统;使用先;使用System.Drawing;使用System.Windows.Forms;使用Leadtools;使用Leadtools.Controls;使用Leadtools.Codecs;使用Leadtools.Drawing;
属性中添加以下全局变量形式类。
私人RasterPictureBox _pictureBox;RasterImage _forwardImage =零;RasterImage _rever沉淀物=零;CodecsImageInfo _imageInfo;
控件中添加以下代码Form1_Load事件处理程序来初始化RasterPictureBox对象。
私人无效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事件处理程序来加载输入文件。
私人无效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 ()方法,如下所示。
将以下代码添加到各自的方法中,如果加载的图像还没有动画,则可以对其进行动画,并创建动画图像的反向扁平副本。
私人无效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);}
私人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 ();返回形象;}}
私人RasterImage inputImage{intw = 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。
私人无效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 |
双击这三个新项目中的每一个,为它们添加事件处理程序,并按如下方式实现它们:
私人无效playForwardToolStripMenuItem_Click (对象发送者,EventArgs{如果(_forwardImage = =零){对话框。显示(“无法播放动画!请先加载图像”);返回;}_pictureBox。Image = _forwardImage;_pictureBox。动画Mode = RasterPictureBoxAnimationMode.Infinite;_pictureBox.PlayAnimation ();}
私人无效playReversedToolStripMenuItem_Click (对象发送者,EventArgs{如果(_reversedImage = =零){对话框。显示(“无法播放动画!请先加载图像”);返回;}_pictureBox。Image = _rever沉淀物;_pictureBox。动画Mode = RasterPictureBoxAnimationMode.Infinite;_pictureBox.PlayAnimation ();}
私人无效stopToolStripMenuItem_Click (对象发送者,EventArgs{_pictureBox.StopAnimation ();}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地遵循了这些步骤,应用程序将运行并加载用户选择的任何多页图像,确保它是动画的,并创建图像的向后动画副本。它还允许将反向动画图像保存到一个新的GIF文件,并播放正向和反向动画。
本教程展示了如何添加必要的引用来加载、反转、回放和保存动画图像。此外,还展示了如何使用RasterPictureBox和RasterImageAnimator类。