带注释的绘图必须保持在 WPF 中的相同位置

Posted

技术标签:

【中文标题】带注释的绘图必须保持在 WPF 中的相同位置【英文标题】:annotated drawing must remain same position where it was done in WPF 【发布时间】:2020-07-20 13:59:04 【问题描述】:

我使用 WPF 应用程序并在 dicom 图像上画了一条线。但我的问题是当我调整主窗口大小时,行位置发生了变化。它不会在我画的地方持续存在。我尝试过使用pointtoscreen 方法和translatepoint 方法。但没有用。这样做的正确方法是什么。

我使用了两个 wpf 图像控件。一个是显示dicom图像,另一个是在它上面绘制注释。以下是我的wpf xaml代码。

<Border x:Name="Border" ClipToBounds="True">
<Grid>
<Image x:Name="ImageTileViewer"
           Margin="-234"
           Source="Binding CurrentImage"
           Stretch="None"
           StretchDirection="DownOnly" RenderTransformOrigin="0.5,0.5"/>

    <Grid Name="AnnotationImageGrid">
                <Image Name="AnnotationImage" Stretch="None" RenderTransformOrigin="0.5,0.5"/>
    </Grid>
</Grid>

【问题讨论】:

看起来你有一个窗口并将两个图像放在窗口中。通常,诀窍是在窗口中添加一个面板,以便参考点始终相同。问题是当您将主图像居中时,线条不会自动移动。如果您注意到两张图片的图像中心完全相同,并且线条长度相同。图像的参考通常是左上角。通过将线条和图像都放在面板中,可以更轻松地在居中时保持参考点相同。 谢谢jdweng。请问有样品吗? @jdweng 我不能告诉你,在调整主窗口大小时,我会覆盖 AnnotationImageGrid 的 SizeChanged 事件。在那里我缩放第二个图像控件(AnnotationImage)。如下-----------------------------------TransformGroup transformGroup = (TransformGroup)_currentTileControl.AnnotationImage.RenderTransform; ScaleTransform st = (ScaleTransform)transformGroup.Children[0]; st.ScaleX = 因子; st.ScaleY = 因子; 通常图像具有以像素为单位的顶部、左侧、宽度、高度。所以你可以保持图像居中线条不必移动,但线条的长度可能需要改变。如果将图像大小加倍,则线的长度将减半。 @jdweng 我在下面提到了这个。 【参考方案1】:
<Grid>
    <Canvas Name="canDrawing" Height="450" Width="800"
        MouseMove="canDrawing_MouseMove_NotDown"
        MouseDown="canDrawing_MouseDown">
        <Image Name="imgTrash" 
               StretchDirection="DownOnly" RenderTransformOrigin="0.5,0.5"
            Source="C:\Users\Chaithika\Downloads\after_resize.PNG" />
    </Canvas>
</Grid>

public Window1()
    
        InitializeComponent();

        TransformGroup group = new TransformGroup();

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

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

        imgTrash.RenderTransform = group;
        canDrawing.RenderTransform = group;
    

  private void Window1_OnSizeChanged(object sender, SizeChangedEventArgs e)
  
   var width = Convert.ToInt32(e.NewSize.Width);
   var height = Convert.ToInt32(e.NewSize.Height);

        double factor = Math.Min((width / imgTrash.ActualWidth), (height /  imgTrash.ActualHeight));
if (width >= imgTrash.ActualWidth && height >= imgTrash.ActualHeight)

    factor = 1;


TransformGroup transformGroup = (TransformGroup)imgTrash.RenderTransform;
ScaleTransform st = (ScaleTransform)transformGroup.Children[0];


st.ScaleX = factor;
st.ScaleY = factor;


TransformGroup transformGroup2 = (TransformGroup)canDrawing.RenderTransform;
ScaleTransform st2 = (ScaleTransform)transformGroup2.Children[0];
st2.ScaleX = factor;
st2.ScaleY = factor;

【讨论】:

以上是关于带注释的绘图必须保持在 WPF 中的相同位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在绘图中创建按组着色的带注释的条

WPF 绘图悖论

WPF学习之绘图和动画

《深入浅出WPF》学习笔记之绘图和动画

Matplotlib 绘图细节设置

如何解决wpf中绘图的卡顿