的RasterImage接口和RasterImage类实现ISerializable标准接口,从而支持。net序列化。
序列化的过程是将对象的状态转化为一种形式,可以保存和运输。序列化反序列化的补充,它将流转换为对象。在一起,这些过程允许数据很容易存储和转移。
你可以很容易地保存和恢复的图像数据RasterImage对象通过保存/加载图像回图像格式支持的众多文件之一LEADTOOLS。然而,通过这样做,你不会丢失任何数据支持的图像文件格式。例如,目前该地区数据在图像是图像格式不支持的任何文件。元数据(标签、标记和注释)是由一些格式,但不是全部。
序列化保存一切解决了这些问题的形象,后来反序列化回到原来的状态。此外,当你获得你自己的类RasterImage,您可以扩展序列化机制来支持保存/恢复自己的数据在图像。
的RasterImage同时支持二进制和XML序列化。
您可以使用二进制序列化来分享RasterImage对象在不同应用程序之间通过序列化到剪贴板。你可以序列化RasterImage流,一个磁盘、内存、网络,等等。Remoting使用二进制序列化传递对象“价值”从一台计算机或应用程序域到另一个地方。
二进制序列化一个序列化是最有效的方法RasterImage对象的序列化/反序列化的速度和使用更少的空间对象的数据。
二进制序列化的例子:
进口先
进口System.Runtime.Serialization.Formatters.Binary
进口Leadtools
进口Leadtools.Codecs
私人子BinarySerializationTest ()
昏暗的编解码器作为RasterCodecs =新RasterCodecs ()
的加载一个形象
昏暗的image1作为RasterImage = codecs.Load (“C: \ LEADTOOLS21 \资源\ \ Image1.cmp图像”)
使用二进制格式化程序
昏暗的格式化程序作为BinaryFormatter =新BinaryFormatter ()
“序列化这图像到内存流
昏暗的味精ydF4y2Ba作为MemoryStream =新MemoryStream ()
格式化程序。image1序列化(女士)
我们完成了图像
image1.Dispose ()
回到一开始的流
ms.Position = 0
“反序列化的形象
昏暗的image2作为RasterImage =CType(如果(TypeOfformatter.Deserialize(女士)是RasterImage formatter.Deserialize(女士),没有什么),RasterImage)
“重新保存图像
codecs.Save (image2“C: \ LEADTOOLS21 \资源\ \ Image1_Serialized.bmp图像”,RasterImageFormat。Bmp, 24)
的清理
image2.Dispose ()
ms.Close ()
codecs.Dispose ()
结束子
使用先;
使用System.Runtime.Serialization.Formatters.Binary;
使用Leadtools;
使用Leadtools.Codecs;
私人无效BinarySerializationTest ()
{
RasterCodecs编解码器=新RasterCodecs ();
/ /加载一个图像
RasterImage image1 = codecs.Load (@“C: \ LEADTOOLS21 \资源\ \ Image1.cmp图像”);
/ /使用二进制格式化程序
BinaryFormatter格式化程序=新BinaryFormatter ();
/ /序列化这张照片到一个内存流
MemoryStream女士=新MemoryStream ();
格式化程序。序列化(ms, image1);
/ /已经完成的形象
image1.Dispose ();
/ /移动回到流的开始
ms.Position = 0;
/ /反序列化的形象
RasterImage image2 = formatter.Deserialize(女士)作为RasterImage;
/ /重新保存图像
codecs.Save (image2@“C: \ LEADTOOLS21 \资源\ \ Image1_Serialized.bmp图像”,RasterImageFormat。Bmp、24);
/ /清理
image2.Dispose ();
ms.Close ();
codecs.Dispose ();
}
您还可以使用序列化RasterImage对象到XML。因为XML是一种开放标准,共享一个XML序列化是一个有吸引力的选择RasterImage对象在网络上。
然而,由于XML是一种文本格式,XML序列化不推荐使用RasterImage对象。序列化/反序列化的速度远慢于二进制序列化和XML序列化对象数据使用更多的空间。
序列化的例子(使用Windows剪贴板)下面的例子显示了如何复制和粘贴RasterImage使用序列化对象到Windows剪贴板。这个示例假设您已经添加的代码形式和调用的方法中创建表单上的构造函数或其他方法的例子。
进口系统
进口System.Windows.Forms
进口Leadtools
进口Leadtools.Codecs
进口Leadtools.WinForms
私人panel1作为面板
私人loadButton作为按钮
私人clearButton作为按钮
私人copyButton作为按钮
私人pasteButton作为按钮
私人rasterImageViewer1作为RasterImageViewer
私人codecs1作为RasterCodecs
私人子ClipboardTest ()
“将控件添加到表单
“1。RasterImageViewer控制
“2。按钮加载映像加载到查看器
“3。清晰的按钮来重置观众的形象。
“3。复制按钮将图像复制到剪贴板
”4。从剪贴板粘贴按钮粘贴图像查看器
“创建控件
我.SuspendLayout ()
loadButton =新按钮
panel1 =新面板
panel1。码头= DockStyle.Left
panel1。宽度= loadButton.Width
我.Controls.Add (panel1)
loadButton。文本=“负载”
loadButton。位置=新点(0,0)
panel1.Controls.Add (loadButton)
loadButton.BringToFront ()
AddHandlerloadButton.Click,AddressOfloadButton_Click
clearButton =新按钮
clearButton。文本=“明确”
clearButton。位置=新点(0,loadButton.Bottom)
panel1.Controls.Add (clearButton)
clearButton.BringToFront ()
AddHandlerclearButton.Click,AddressOfclearButton_Click
copyButton =新按钮
copyButton。文本=“复制”
copyButton。位置=新点(0,clearButton.Bottom)
panel1.Controls.Add (copyButton)
copyButton.BringToFront ()
AddHandlercopyButton.Click,AddressOfcopyButton_Click
pasteButton =新按钮
pasteButton。文本=“粘贴”
pasteButton。位置=新点(0,copyButton.Bottom)
panel1.Controls.Add (pasteButton)
pasteButton.BringToFront ()
AddHandlerpasteButton.Click,AddressOfpasteButton_Click
rasterImageViewer1 =新RasterImageViewer
rasterImageViewer1。码头= DockStyle.Fill
Controls.Add (rasterImageViewer1)
rasterImageViewer1.BringToFront ()
我.ResumeLayout ()
”编解码器对象初始化
codecs1 =新RasterCodecs
更新我们的用户界面
UpdateMyUserInterface ()
结束子
私人子UpdateMyUserInterface ()
根据应用程序状态的更新按钮
“Clear按钮启用如果我们有一个图像
clearButton。启用= (不rasterImageViewer1.Image是没有什么)
“复制按钮启用如果我们有一个图像
copyButton。启用= (不rasterImageViewer1.Image是没有什么)
“粘贴按钮启用如果我们有一个有效的剪贴板格式
昏暗的数据作为IDataObject = Clipboard.GetDataObject ()
pasteButton。启用= data.GetDataPresent (方法(RasterImage))
结束子
私人子loadButton_Click (按值传递发送方作为对象,按值传递e作为EventArgs)
加载一个新的图像查看器
昏暗的了解地理作为新OpenFileDialog
了解地理。过滤器=“所有文件| * *”。
如果(dlg.ShowDialog (我)= DialogResult.OK)然后
试一试
rasterImageViewer1.Image=codecs1。Load(dlg.FileName)
抓前女友作为异常
MessageBox.Show (我ex.Message)
最后
更新用户界面
UpdateMyUserInterface ()
结束试一试
结束如果
结束子
私人子clearButton_Click (按值传递发送方作为对象,按值传递e作为EventArgs)
“删除的图像查看器
rasterImageViewer1.Image=没有什么
更新用户界面
UpdateMyUserInterface ()
结束子
私人子copyButton_Click (按值传递发送方作为对象,按值传递e作为EventArgs)
的图像查看器中的复制到剪贴板
Clipboard.SetDataObject (rasterImageViewer1.Image真正的)
更新用户界面
UpdateMyUserInterface ()
结束子
私人子pasteButton_Click (按值传递发送方作为对象,按值传递e作为EventArgs)
“将图像从剪贴板粘贴到查看器
昏暗的数据作为IDataObject = Clipboard.GetDataObject ()
rasterImageViewer1.Image=CType(data.GetData (方法(RasterImage)), RasterImage)
更新用户界面
UpdateMyUserInterface ()
结束子
使用系统;
使用System.Windows.Forms;
使用Leadtools;
使用Leadtools.Codecs;
使用Leadtools.WinForms;
私人面板panel1;
私人按钮loadButton;
私人按钮clearButton;
私人按钮copyButton;
私人按钮pasteButton;
私人RasterImageViewer rasterImageViewer1;
私人RasterCodecs codecs1;
私人无效ClipboardTest ()
{
/ /将控件添加到表单
/ / 1。RasterImageViewer控制
/ / 2。按钮加载映像加载到查看器
/ / 3。清晰的按钮来重置观众的形象。
/ / 3。复制按钮将图像复制到剪贴板
/ / 4。从剪贴板粘贴按钮粘贴图像查看器
/ /创建控件
这.SuspendLayout ();
loadButton =新按钮();
panel1 =新面板();
panel1。码头= DockStyle.Left;
panel1。宽度= loadButton.Width;
这.Controls.Add (panel1);
loadButton。文本=“负载”;
loadButton。位置=新点(0,0);
panel1.Controls.Add (loadButton);
loadButton.BringToFront ();
loadButton。单击+ =新EventHandler (loadButton_Click);
clearButton =新按钮();
clearButton。文本=“明确”;
clearButton。位置=新点(0,loadButton.Bottom);
panel1.Controls.Add (clearButton);
clearButton.BringToFront ();
clearButton。单击+ =新EventHandler (clearButton_Click);
copyButton =新按钮();
copyButton。文本=“复制”;
copyButton。位置=新点(0,clearButton.Bottom);
panel1.Controls.Add (copyButton);
copyButton.BringToFront ();
copyButton。单击+ =新EventHandler (copyButton_Click);
pasteButton =新按钮();
pasteButton。文本=“粘贴”;
pasteButton。位置=新点(0,copyButton.Bottom);
panel1.Controls.Add (pasteButton);
pasteButton.BringToFront ();
pasteButton。单击+ =新EventHandler (pasteButton_Click);
rasterImageViewer1 =新RasterImageViewer ();
rasterImageViewer1。码头= DockStyle.Fill;
Controls.Add (rasterImageViewer1);
rasterImageViewer1.BringToFront ();
这.ResumeLayout ();
/ /初始化对象编解码器
codecs1 =新RasterCodecs ();
/ /更新用户界面
UpdateMyUserInterface ();
}
私人无效UpdateMyUserInterface ()
{
/ /更新按钮取决于应用程序状态
/ /启用Clear按钮如果我们有一个图像
clearButton。= rasterImageViewer1启用。形象! =零;
/ /复制按钮启用如果我们有一个图像
copyButton。= rasterImageViewer1启用。形象! =零;
/ /粘贴按钮启用如果我们有一个有效的剪贴板格式
IDataObject data = Clipboard.GetDataObject ();
pasteButton。启用= data.GetDataPresent (typeof(RasterImage));
}
私人无效loadButton_Click (对象发送方的EventArgs e)
{
/ /加载一个新的图像查看器
OpenFileDialog dlg =新OpenFileDialog ();
了解地理。过滤器=“所有文件| * *”。;
如果(dlg.ShowDialog (这)= = DialogResult.OK)
{
试一试
{
rasterImageViewer1.Image=codecs1。Load(dlg.FileName);
}
抓(异常交货)
{
MessageBox.Show (这,ex.Message);
}
最后
{
/ /更新用户界面
UpdateMyUserInterface ();
}
}
}
私人无效clearButton_Click (对象发送方的EventArgs e)
{
/ /删除的图像查看器
rasterImageViewer1.Image=零;
/ /更新用户界面
UpdateMyUserInterface ();
}
私人无效copyButton_Click (对象发送方的EventArgs e)
{
/ /图像查看器中的复制到剪贴板
Clipboard.SetDataObject (rasterImageViewer1.Image真正的);
/ /更新用户界面
UpdateMyUserInterface ();
}
私人无效pasteButton_Click (对象发送方的EventArgs e)
{
/ /将图像从剪贴板粘贴到查看器
IDataObject data = Clipboard.GetDataObject ();
rasterImageViewer1.Image=数据。得到Data(typeof(RasterImage))作为RasterImage;
/ /更新用户界面
UpdateMyUserInterface ();
}
的RasterImage类可以从添加用户定义的功能。派生类可能需要添加新类成员变量来定义这个新功能的类。作者必须添加对序列化的支持这些新类成员变量为了参与序列化过程。
下面的例子展示了MyRasterImage,一个来自类RasterImage添加两个新的属性。
进口先
进口System.Runtime.Serialization
进口System.Runtime.Serialization.Formatters.Binary
进口Leadtools
进口Leadtools.Codecs
公共类MyRasterImage
继承了RasterImage
我们的新成员
我们要做序列化
私人_myIntegerData作为整数
私人_myStringData作为字符串
的访问器
公共财产MyIntegerData ()作为整数
得到
返回_myIntegerData
结束得到
集(按值传递价值作为整数)
_myIntegerData =值
结束集
结束财产
公共财产MyStringData ()作为字符串
得到
返回_myStringData
结束得到
集(按值传递价值作为字符串)
_myStringData =值
结束集
结束财产
的构造函数
公共子新(按值传递src作为RasterImage)
MyBase。新(src)
_myIntegerData = 0
_myStringData =字符串空虚
结束子
“序列化代码
受保护的子新(按值传递信息作为SerializationInfo,按值传递上下文作为StreamingContext)
MyBase。新(信息,上下文)
“加载数据
_myIntegerData = info.GetInt32 (“MyIntegerData”)
_myStringData = info.GetString (“MyStringData”)
结束子
公共覆盖子GetObjectData (按值传递信息作为SerializationInfo,按值传递上下文作为StreamingContext)
“总是调用基方法
MyBase.GetObjectData(信息,上下文)
“拯救我们的数据
info.AddValue (“MyIntegerData”_myIntegerData)
info.AddValue (“MyStringData”_myStringData)
结束子
结束类
私人子MyRasterImageTest ()
的加载一个形象
昏暗的编解码器作为新RasterCodecs
昏暗的img作为RasterImage = codecs.Load (“C: \ LEADTOOLS21 \资源\ \ Image1.cmp图像”)
“创建一个新的MyRasterImage实例的形象
昏暗的模板作为MyRasterImage =新MyRasterImage (img)
设置自定义的数据
模板。MyIntegerData = 10
模板。MyStringData =“我的字符串”
昏暗的味精作为字符串=字符串.Format (“在序列化。MyIntegerData = {0}, MyStringData = {1} "模板。MyIntegerData myImage.MyStringData)
MessageBox.Show(味精)
“现在img是无效的,应该处理
img.Dispose ()
序列化的模板
昏暗的格式化程序作为新BinaryFormatter
昏暗的味精ydF4y2Ba作为新MemoryStream
格式化程序。序列化(ms、模板)
“处理模板
myImage.Dispose ()
myImage =没有什么
“从流进行反序列化
ms.Position = 0
myImage =DirectCast(formatter.Deserialize(女士),MyRasterImage)
味精=字符串.Format (“在序列化。MyIntegerData = {0}, MyStringData = {1} "模板。MyIntegerData myImage.MyStringData)
MessageBox.Show(味精)
的清理
ms.Close ()
myImage.Dispose ()
codecs.Dispose ()
结束子
使用先;
使用System.Runtime.Serialization;
使用System.Runtime.Serialization.Formatters.Binary;
使用Leadtools;
使用Leadtools.Codecs;
(序列化)
公共类MyRasterImage: RasterImage
{
/ /我们的新成员
/ /我们自己要做序列化
(NonSerialized)私人int_myIntegerData;
(NonSerialized)私人字符串_myStringData;
/ /访问器
公共intMyIntegerData
{
得到
{
返回_myIntegerData;
}
集
{
_myIntegerData =价值;
}
}
公共字符串MyStringData
{
得到
{
返回_myStringData;
}
集
{
_myStringData =价值;
}
}
/ /构造函数
公共MyRasterImage (RasterImage src):
基地(src)
{
_myIntegerData = 0;
_myStringData =字符串空虚;
}
/ /序列化代码
受保护的MyRasterImage (SerializationInfo信息,StreamingContext上下文):
基地(信息,上下文)
{
/ /加载数据
_myIntegerData = info.GetInt32 (“MyIntegerData”);
_myStringData = info.GetString (“MyStringData”);
}
公共覆盖无效GetObjectData (SerializationInfo信息,StreamingContext上下文)
{
/ /调用基方法
基地.GetObjectData(信息,上下文);
/ /保存数据
info.AddValue (“MyIntegerData”,_myIntegerData);
info.AddValue (“MyStringData”,_myStringData);
}
}
私人无效MyRasterImageTest ()
{
/ /加载一个图像
RasterCodecs编解码器=新RasterCodecs ();
RasterImage img = codecs.Load (@“C: \ LEADTOOLS21 \资源\ \ Image1.cmp图像”);
/ /创建一个新的MyRasterImage实例的形象
MyRasterImage myImage =新MyRasterImage (img);
/ /设置自定义数据
模板。MyIntegerData = 10;
模板。MyStringData =“我的字符串”;
字符串味精=字符串.Format (“在序列化。MyIntegerData = {0}, MyStringData = {1} "模板。MyIntegerData myImage.MyStringData);
MessageBox.Show(味精);
/ / img是无效的,应该处理
img.Dispose ();
/ /序列化模板
BinaryFormatter格式化程序=新BinaryFormatter ();
MemoryStream女士=新MemoryStream ();
格式化程序。序列化(ms,模板);
/ /处理模板
myImage.Dispose ();
myImage =零;
/ /反序列化流
ms.Position = 0;
myImage = formatter.Deserialize(女士)作为MyRasterImage;
味精=字符串.Format (“在序列化。MyIntegerData = {0}, MyStringData = {1} "模板。MyIntegerData myImage.MyStringData);
MessageBox.Show(味精);
/ /清理
ms.Close ();
myImage.Dispose ();
codecs.Dispose ();
}