本教程展示了如何在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.dll
Leadtools.Drawing.dll
Leadtools.Controls.WinForms.dll
Leadtools.Codecs.dll
Leadtools.Codecs.Gif.dll
Leadtools.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;//新插入的帧总是编号1
flatImage。动画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
类。