Как преобразовать координаты из элемента управления WPF Image в его источник и обратно? - PullRequest
1 голос
/ 25 июля 2011

Как реализовать эту простую функциональность (простую в Winforms) в WPF?Изображение отображается с помощью Stretch = "Uniform".После нажатия на изображение координаты (относительно исходного изображения) сохраняются, и точка щелчка отображается (маленький прямоугольник) над изображением.

В winforms я сделал это, найдя масштаб и смещение исходного изображения в PictureBox, а затем легко преобразовал координаты изображения.Далее в winforms я использовал функцию GetGraphics (), чтобы пометки не были постоянными и могли быть перерисованы из сохраненных при каждом изменении размера, прямоугольники, добавленные в WPF, остаются на своих местах.

Что лучшеспособ сделать это?Или лучше использовать элемент управления WinForm в окне WPF?

Редактировать: Масштабирование - скопировано из 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...