本教程展示了如何加载一个多页的形象,扭转其页面的顺序,文件导出到一个GIF动画在WinForms c#应用程序使用LEADTOOLS SDK。
概述 | |
---|---|
总结 | 本教程介绍了如何逆转多页图像并将其导出为GIF动画图片在WinForms c#应用程序。 |
完成时间 | 45分钟 |
Visual Studio项目 | 下载教程项目(5 KB) |
平台 | Windows WinForms c#应用程序 |
IDE | Visual Studio 2022 |
开发许可 | 下载LEADTOOLS |
试试用另一种语言 |
|
熟悉基本的步骤创建一个项目的审查添加引用和设置一个许可证教程,在工作之前多页图像转换为反向GIF动画——WinForms c#教程。
也检查显示图像的图像查看器教程的细节处理WinForms菜单和事件。
从项目中创建的副本添加引用和设置一个许可证教程。如果你没有这个项目,按照这个教程中的步骤创建它。
的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。
如果使用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文件,请参考文件包含在您的应用程序。
许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可。
有两种类型的运行时许可证:
请注意
添加LEADTOOLS NuGet和本地引用设置许可中会详细介绍添加引用和设置一个许可证教程。
与项目创建、添加引用,许可,可以开始编码。
在解决方案资源管理器,双击Form1.cs
显示它的设计师。单击事件图标属性窗口。然后,双击负载创建一个事件处理程序如果不存在。这将弹出背后的代码形式。
添加使用
下面的语句。
/ /使用块
使用系统;
使用先;
使用System.Drawing;
使用System.Windows.Forms;
使用Leadtools;
使用Leadtools.Controls;
使用Leadtools.Codecs;
使用Leadtools.Drawing;
添加下全局变量形式
类。
私人RasterPictureBox _pictureBox;
RasterImage _forwardImage =零;
RasterImage _reversedImage =零;
CodecsImageInfo _imageInfo;
添加以下代码内部Form1_Load
事件处理程序初始化RasterPictureBox
对象。
私人无效Form1_Load (对象发送方的EventArgs e)
{
_pictureBox =新RasterPictureBox ();
_pictureBox。SizeMode = RasterPictureBoxSizeMode.Fit;
_pictureBox。AutoDisposeImage =假;
RasterPaintProperties paintProperties = _pictureBox.PaintProperties;
paintProperties。PaintEngine = RasterPaintEngine.GdiPlus;
_pictureBox。PaintProperties = PaintProperties;
_pictureBox。码头= DockStyle.Fill;
_pictureBox。背景色= Color.DarkGray;
Controls.Add (_pictureBox);
_pictureBox.BringToFront ();
}
开放Form1.cs
在解决方案资源管理器。去工具箱并双击MenuStrip将添加一个菜单形式。添加一个文件下拉菜单。确保文本的下拉菜单文件。在文件下拉,添加一个新的子菜单,文本状态。把新项目的名称openToolStripMenuItem
。
双击开放
菜单项来创建事件处理程序。
将下面的代码添加到openToolStripMenuItem_Click
事件处理程序来加载您的输入文件。
私人无效openToolStripMenuItem_Click (对象发送方的EventArgs e)
{
{
试一试
{
使用(RasterCodecs编解码器=新RasterCodecs ())
{
OpenFileDialog dlg =新OpenFileDialog ();
了解地理。过滤器=“GIF图像| *。gif | | *。*所有文件”;
如果(dlg.ShowDialog (这)= = DialogResult.OK)
{
var信息= codecs.GetInformation (dlg.FileName,真正的);
如果(信息。TotalPages < 2)
{
MessageBox.Show (“文件没有多个帧。不加载”。);
返回;
}
_imageInfo =信息;
varloadedImage = codecs.Load (dlg)。文件Name, 0, CodecsLoadByteOrder.BgrOrGray, 1, -1);
AnimateAndReverse (loadedImage);
_pictureBox。形象= _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;我< = originalImage.PageCount;我+ +)
{
originalImage之下。页面=我;
/ /如果帧没有延迟,添加一个默认值
如果(originalImage之下。动画Delay == 0)
originalImage之下。动画Delay = 50;
}
/ /如果原始图像不是动画,保存然后负载GIF动画
如果(_imageInfo.Gif.HasAnimationLoop !)
originalImage之下= SetGifProperties (originalImage之下);
_forwardImage = originalImage之下;
_forwardImage。页面= 1;
vartmpImage = FlattenAndReverse (originalImage之下);
_reversedImage = SetGifProperties (tmpImage);
}
私人RasterImage SetGifProperties (RasterImage图片)
{
使用(RasterCodecs编解码器=新RasterCodecs ())
{
/ /保存为GIF和重载轻松地设置动画属性
MemoryStream女士=新MemoryStream ();
的形象。页面= 1;
编解码器。保存(RasterImageFormat形象,女士。Gif, 8);
ms.Position = 0;
_imageInfo = codecs.GetInformation(女士,真正的);
形象=编解码器。负载(ms, 24, CodecsLoadByteOrder.BgrOrGray, 1, -1);
ms.Dispose ();
返回形象;
}
}
私人RasterImage FlattenAndReverse (RasterImage inputImage)
{
intw = inputImage.AnimationGlobalSize。宽度,h = inputImage.AnimationGlobalSize.Height;
如果(w < = 0)
w = inputImage.Width;
如果(h < = 0)
h = inputImage.Height;
RasterImage renderImage =新RasterImage (
RasterMemoryFlags.Conventional,
w,
h,
inputImage.BitsPerPixel,
inputImage.Order,
inputImage.ViewPerspective,
零,
IntPtr.Zero,
0);
/ /将调色板从动画的图像复制到这个新创建的图像
inputImage.CopyPaletteTo (renderImage);
RasterImage flatImage =零;
/ /创建RasterImageAnimator对象
RasterImageAnimator _animator =新RasterImageAnimator (renderImage inputImage);
/ /动画它在相反的顺序并保存帧
/ /使用GDI +油漆引擎支持透明的颜色
RasterPaintProperties道具= _pictureBox.PaintProperties;
道具。PaintEngine = RasterPaintEngine.GdiPlus;
使用(RasterImageGdiPlusGraphicsContainer _gdiPlusGraphics =新RasterImageGdiPlusGraphicsContainer (renderImage))
{
图g = _gdiPlusGraphics.Graphics;
RasterImageAnimatorState状态;
bool做=假;
而(!)
{
LeadRect srcRect =新LeadRect (0, 0, renderImage。ImageWidth renderImage.ImageHeight);
LeadRect updateRect;
LeadRect destRect;
状态= _animator.Process ();
开关(状态)
{
情况下RasterImageAnimatorState.WaitDelay:
情况下RasterImageAnimatorState.WaitInputDelay:
/ /设置动画延迟到最后一帧插入
flatImage。动画Delay = _animator.Delay;
_animator.CancelWait ();
打破;
情况下RasterImageAnimatorState.Render:
打破;
情况下RasterImageAnimatorState.WaitInput:
/ /如果动画形象的“等待用户输入”旗帜,
/ /取消等待
_animator.CancelWait ();
打破;
情况下RasterImageAnimatorState.PostRender:
/ /得到的目标图像区域已经改变了
updateRect = _animator.GetUpdateRectangle (真正的);
destRect =新LeadRect (0, 0, renderImage。ImageWidth renderImage.ImageHeight);
/ /把它漆成
RasterImagePainter。油漆(renderImage g, srcRect、updateRect destRect, destRect,道具);
如果(flatImage = =零)
flatImage = renderImage.Clone ();
其他的
flatImage。在sertPage(0, renderImage.Clone());/ /插入帧开始逆转
flatImage。页面= 1;/ /新插入的框架总是第一
flatImage。动画Delay = 50;/ /设置值,以防不提供一个动画。
打破;
情况下RasterImageAnimatorState.End:
做=真正的;/ /存在循环一旦动画就完成了
打破;
默认的:
打破;
}
}
}
返回flatImage;
}
导航回形式的设计师,使用解决方案资源管理器。添加一个新的并保存了
子菜单到文件下拉菜单。把新项目的名称saveReversedToolStripMenuItem
。
双击并保存了
菜单项来创建事件处理程序,然后添加以下代码导出GIF动画。
私人无效saveReversedToolStripMenuItem_Click (对象发送方的EventArgs e)
{
如果(_reversedImage = =零)
{
MessageBox.Show (“无法保存!请先加载图像”);
返回;
}
试一试
{
SaveFileDialog saveDlg =新SaveFileDialog ();
saveDlg。过滤器=“GIF图像| * GIF”;
如果(saveDlg.ShowDialog (这)! = DialogResult.OK)
返回;
使用(RasterCodecs编解码器=新RasterCodecs ())
{
codecs.Save (_pictureBox。形象,saveDlg。文件Name, RasterImageFormat.Gif, 8);
}
}
抓(异常交货)
{
MessageBox.Show (ex.ToString ());
}
}
开放Form1.cs
在解决方案资源管理器。添加一个新的下拉菜单,动画旁边的,文件下拉菜单。添加以下三个子菜单新的下拉菜单:
项文本 | 物品的名称 |
---|---|
打前锋 | playForwardToolStripMenuItem |
玩逆转 | playReversedToolStripMenuItem |
和停止 | stopToolStripMenuItem |
双击每个三个新项添加事件处理程序,并实现如下:
私人无效playForwardToolStripMenuItem_Click (对象发送方的EventArgs e)
{
如果(_forwardImage = =零)
{
MessageBox.Show (“无法播放动画!请先加载图像”);
返回;
}
_pictureBox。形象= _forwardImage;
_pictureBox。动画Mode = RasterPictureBoxAnimationMode.Infinite;
_pictureBox.PlayAnimation ();
}
私人无效playReversedToolStripMenuItem_Click (对象发送方的EventArgs e)
{
如果(_reversedImage = =零)
{
MessageBox.Show (“无法播放动画!请先加载图像”);
返回;
}
_pictureBox。形象= _reversedImage;
_pictureBox。动画Mode = RasterPictureBoxAnimationMode.Infinite;
_pictureBox.PlayAnimation ();
}
私人无效stopToolStripMenuItem_Click (对象发送方的EventArgs e)
{
_pictureBox.StopAnimation ();
}
按运行项目F5,或通过选择调试- >开始调试。
如果步骤正确之后,应用程序运行和加载任何多页图像由用户选择,确保它是动画,并创建一个backward-animated图像的副本。它还允许reverse-animated图像保存到一个新的GIF文件,和打前锋和逆转动画。
本教程展示了如何添加必要的参考负载,反向,回放,并保存的动画图像。此外,它展示了如何使用RasterPictureBox
和RasterImageAnimator
类。