Имитация возможностей масштабирования и перетаскивания камеры WP7 в приложении - PullRequest
0 голосов
/ 20 октября 2011

Я пытаюсь сделать так, чтобы пользователь сделал снимок чего-то, содержащего текст, чтобы пользователь мог выделить текст, с которым он хотел бы запустить OCR.

У меня есть часть изображения вниз, и я могу отобразить изображение. Затем я хотел бы, чтобы пользователь мог ущипнуть, чтобы увеличить масштаб, а затем проведите пальцем, чтобы переместить изображение так же, как снимок камеры для отдельной фотографии. Это позволило бы пользователю более четко видеть текст, который он хотел бы использовать для распознавания текста. В настоящее время у меня работает только пинч-зум, но очень плохо.

private Popup popup = new Popup { IsOpen = true };
private Grid grid = new Grid { Width = 480, Height = 800 };
private Image backgroundImage = new Image
{
    Stretch = Stretch.Uniform,
    RenderTransformOrigin = new Point(.5, .5),
    RenderTransform = new CompositeTransform()
};

void OCRSelection_Loaded(object sender, RoutedEventArgs e)
{
   this.grid.Children.Add(this.backgroundImage);
   this.popup.Child = this.grid;
   var gl = GestureService.GetGestureListener(this.backgroundImage);
   gl.PinchStarted += new EventHandler<PinchStartedGestureEventArgs(gl_PinchStarted);
   gl.PinchDelta += new EventHandler<PinchGestureEventArgs>(gl_PinchDelta);
}

private void gl_PinchStarted(object sender, PinchStartedGestureEventArgs e)
{
    _oldFinger1 = e.GetPosition(this.backgroundImage, 0);
    _oldFinger2 = e.GetPosition(this.backgroundImage, 1);
    _oldScaleFactor = 1;
}

private void gl_PinchDelta(object sender, PinchGestureEventArgs e)
{
        var scaleFactor = e.DistanceRatio / _oldScaleFactor;

        var currentFinger1 = e.GetPosition(this.backgroundImage, 0);
        var currentFinger2 = e.GetPosition(this.backgroundImage, 1);

        var translationDelta = GetTranslationDelta(
            currentFinger1,
            currentFinger2,
            _oldFinger1,
            _oldFinger2,
            ImagePosition,
            scaleFactor);

        _oldFinger1 = currentFinger1;
        _oldFinger2 = currentFinger2;
        _oldScaleFactor = e.DistanceRatio;

        UpdateImage(scaleFactor, translationDelta);
}
private void UpdateImage(double scaleFactor, Point delta)
{
    TotalImageScale *= scaleFactor;
    ImagePosition = new Point(ImagePosition.X + delta.X, ImagePosition.Y + delta.Y);

    var transform = (CompositeTransform)this.backgroundImage.RenderTransform;
        transform.ScaleX = TotalImageScale;
        transform.ScaleY = TotalImageScale;
        transform.TranslateX = ImagePosition.X;
        transform.TranslateY = ImagePosition.Y;
    }

private Point GetTranslationDelta( Point currentFinger1, Point currentFinger2, Point oldFinger1, Point oldFinger2,
                                        Point currentPosition, double scaleFactor)
{
    var newPos1 = new Point(
        currentFinger1.X + (currentPosition.X - oldFinger1.X) * scaleFactor,
        currentFinger1.Y + (currentPosition.Y - oldFinger1.Y) * scaleFactor);

    var newPos2 = new Point(
        currentFinger2.X + (currentPosition.X - oldFinger2.X) * scaleFactor,
        currentFinger2.Y + (currentPosition.Y - oldFinger2.Y) * scaleFactor);

    var newPos = new Point(
        (newPos1.X + newPos2.X) / 2,
        (newPos1.Y + newPos2.Y) / 2);

    return new Point(
        newPos.X - currentPosition.X,
            newPos.Y - currentPosition.Y);
}

Я нашел этот код в WindowsPhoneGeek, поэтому я не возьму на себя 100% скидку. Я на самом деле теряю изображение при слишком большом удалении, и оно сходит с ума, подпрыгивая на разных полях, когда я также уменьшаю масштаб. Я считаю, что это может быть потому, что я должен повернуть изображение на 90 градусов.

Я бы также хотел, чтобы пользователь перемещал изображение жестом перетаскивания. Кто-нибудь когда-либо делал что-то подобное или есть какие-либо советы?

Кроме того, это всего лишь моя вторая неделя работы с WP7, поэтому я могу просто упустить что-то простое. Заранее спасибо.

1 Ответ

1 голос
/ 20 октября 2011

В http://multitouch.codeplex.com/ есть некоторые ранее существовавшие поведения, которые могут быть более простым решением для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...