【问题标题】:WPF: Revert changes after transforming an ImageWPF:转换图像后还原更改
【发布时间】:2013-05-11 20:09:55
【问题描述】:

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

我想知道如何将控件恢复为原始状态。

用户决定更换图片后,图片框必须恢复到原来的位置和状态,这样他/她才能开始正确和新鲜地缩放。

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

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

【问题讨论】:

    标签: c# wpf image transform


    【解决方案1】:

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

    【讨论】:

    • 根据this博客,Object.Clone()不返回深拷贝!
    • WPF 图像控件没有Clone() ;)
    【解决方案2】:

    根据您提供的小代码,我假设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)方法并手动创建克隆。然而,这些步骤中的任何一个都是必要的!

    【讨论】:

    • 无法让您的第一部分工作。我以前从未使用过序列化 :( 它在 formatter.Serialize 行抛出异常
    【解决方案3】:

    好的,我已经尝试了很多方法来深度复制图像控件。但似乎没有可以开箱即用的功能。不过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;
            }
    

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

    谢谢。

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多