如何将坐标从WPF图像控件转换为其源和后面?

时间:2011-07-25 15:52:46

标签: c# winforms wpf-controls

如何在WPF中实现这个简单的功能(在Winforms中简单)? 图像以Stretch =“Uniform”显示。单击图像后,将保存坐标(相对于源图像),并在图像上显示点击点(小矩形)。

在winforms中,我通过查找PictureBox中的源图像的缩放和偏移来实现它,并且轻松转换了图像坐标。 接下来就是在winforms中我使用了GetGraphics()函数,因此标记不是持久性的,并且可以在每次调整大小时从已保存的标记重绘,WPF中添加的矩形会保留在它们的位置。

最好的方法是什么?或者在WPF窗口中使用WinForm控件是否更好?

编辑: 扩展计算 - 从Winforms复制并更新

    private void ComputeScale ()
    {
        if (image1.Source == null)
        {
            this.imageScale = 1;
            this.offsetX = 0;
            this.offsetY = 0;
            return;
        }

        //todo: picture has to be bigger than PictureBox
        decimal imW = (decimal)image1.Source.Width;
        decimal imH = (decimal)image1.Source.Height;
        decimal pbW = (decimal)image1.ActualWidth;
        decimal pbH = (decimal)image1.ActualHeight;
        decimal scaleX = pbW / imW;
        decimal scaleY = pbH / imH;
        decimal scale = Math.Min (scaleX, scaleY);
        decimal offsetX = Math.Round ((pbW - Math.Round (imW * scale)) / 2);
        decimal offsetY = Math.Round ((pbH - Math.Round (imH * scale)) / 2);

        this.imageScale = scale;
        this.offsetX = (int)offsetX;
        this.offsetY = (int)offsetY;
    }

绘制矩形

            Point p = e.GetPosition(image1);
            decimal x = ((decimal)(p.X - offsetX)) / imageScale;
            decimal y = ((decimal)(p.Y - offsetY)) / imageScale;

            System.Drawing.Point ClickedSample = new System.Drawing.Point((int)Math.Round(x), (int)Math.Round(y));

            Samples.Add(ClickedSample);
            //PaintSampleMark
            Rectangle r = new Rectangle();

            r.StrokeThickness=1;
            r.Stroke= Brushes.Blue;
            r.Width = sampleRadius*2;
            r.Height= sampleRadius*2;

            r.Margin = new Thickness ((double)(offsetX - sampleRadius + x), (double)(offsetY - sampleRadius + y), 0, 0);
            canvas1.Children.Add(r);

0 个答案:

没有答案