WPF:转换图像后还原更改

时间:2013-05-11 20:09:55

标签: c# wpf image transform

我正在使用this代码来缩放&平移我的图像控制。

我想知道如何将控制恢复到原始状态。

用户决定更改图片后,必须将图片框恢复到原始位置和状态,这样他/她才能正常开始放大。

我尝试使用类似的东西,但仍然没有运气:

Image OriginalPic;
...
...
InitializeComponents();
OriginalPic = MainPic;
...
...
void ChangePic(){
MainPic = OriginalPic; // Doesn't work :(
...
}

3 个答案:

答案 0 :(得分:0)

根据您提供的小代码,我假设MainPicOriginalPic都会引用相同的对象 - >对一个引用的更改也会影响另一个引用。您实际上需要创建一个包含原始信息的备用图片,您需要创建一张deep copy的图片。

参考this帖子:

public static T DeepClone<T>(T obj)
{
 using (var ms = new MemoryStream())
 {
   var formatter = new BinaryFormatter();
   formatter.Serialize(ms, obj);
   ms.Position = 0;

   return (T) formatter.Deserialize(ms);
 }
}

这将创建Image的深层副本,您可以使用该副本将图像恢复为原始状态。


另外,我找到了使用ICloneable-Interface的教程:

要获得对象的深层副本,您必须为Invoice及其所有相关类实现IClonable接口:

public class Invoice: IClonable
{
 public int No;
 public DateTime Date;
 public Person Customer;
 //.............

 public object Clone()
 {
 Invoice myInvoice = (Invoice)this.MemberwiseClone();
 myInvoice.Customer = (Person) this.Customer.Clone();
 return myInvoice;
 }
}

public class Person: IClonable
{
 public string Name;
 public int Age;

 public object Clone()
 {
 return this.MemberwiseClone();
 }
}

修改

似乎无法序列化System.Windows.Controls.Image ...您可以尝试从中派生并实现ISerializable或创建(static)方法并手动创建克隆。然而,任何这些步骤都是必要的!

答案 1 :(得分:0)

OriginalPic = MainPic;更改为:OriginalPic = MainPic.Clone();

答案 2 :(得分:0)

好的我已经尝试了很多方法来深度复制图像控件。但似乎没有任何功能可以开箱即用。但是bash.d有一个想法。

  • 尝试使用XamplWriter和XamlReader。
  • 深度复制它的父对象也不起作用。
  • 尝试使用ObjectExtensions.cs,它应该适用于任何对象。

以下是我为恢复转型所做的工作:

void ResetTransformationOfImage()
        {
            TransformGroup group = new TransformGroup();

            ScaleTransform xform = new ScaleTransform();
            group.Children.Add(xform);

            TranslateTransform tt = new TranslateTransform();
            group.Children.Add(tt);

            MainPic.RenderTransform = group;
        }

无论如何,我会期待看到是否有人能够实现这样的复制功能并将其标记为真正的答案,即使我的问题现在已经解决了。

感谢。