WPF Обрезка части изображения - PullRequest
0 голосов
/ 03 июля 2018

Я создал приложение WPF, в котором мне нужно разрешить пользователю рисовать прямоугольник на существующем загруженном изображении (tif-изображение) и сохранять его координаты / часть прямоугольника как отдельное изображение.

Я использую ссылку Leadtools.Windows.Controls и использую RasterImageViewer

Ниже приведен код для обработчика событий, когда пользователь завершил рисование прямоугольника.

private void ImageViewer_InteractiveUserRectangle(object sender, RectangleInteractiveEventArgs e)
    {
        if (e.Status == InteractiveModeStatus.End)
        {             

            var img = ImageViewer.Image;

            var top =Convert.ToInt32(e.Bounds.Top);
            var left = Convert.ToInt32(e.Bounds.Left);
            var width = Convert.ToInt32(e.Bounds.Width);
            var height = Convert.ToInt32(e.Bounds.Height);

            var rect = new Leadtools.LeadRect(left, top, width, height);
            var cmd = new Leadtools.ImageProcessing.CropCommand(rect);
            cmd.Run(img);

            _codecs.Save(img, @"c:\temp\test.tif",
                RasterImageFormat.CcittGroup4, 1, 1, 1, -1, CodecsSavePageMode.Append);
        }
    }

Я получаю отдельное обрезанное изображение, но оно не соответствует области, нарисованной прямоугольником. Я попробовал различные методы из примеров, но все они были для приложений Windows Forms, а не WPF. Буду признателен за любую помощь в том, что мне не хватает.

1 Ответ

0 голосов
/ 03 июля 2018

Проблема в том, что границы UserRectangle ImageViewer возвращают координаты в координатах элемента управления, и вам необходимо преобразовать их в координаты изображения, которые ищет команда обрезки.

Согласно документации здесь: https://www.leadtools.com/help/leadtools/v19/dh/wl/rectangleinteractiveeventargs-bounds.html

Координаты всегда находятся в управлении (отображать) для координат изображения. Вы можете использовать PointToImageCoordinates и BoundsToImageCoordinates для отобразить значение в элементе управления или отобразить координаты (что на экране) координаты изображения (фактическое положение x и y в пикселях изображения). Вы можно использовать PointFromImageCoordinates и BoundsFromImageCoordinates для отобразить значение в координатах изображения (фактическое положение x и y в пикселей изображения) для управления или отображения координат (что на экране).

Вот обновленный код, чтобы он работал для вашего проекта:

if (e.Status == Leadtools.Windows.Controls.InteractiveModeStatus.End)
{
  var img = imageViewer.Image;

  var imgRect = imageViewer.BoundsToImageCoordinates(e.Bounds);

  var top = Convert.ToInt32(imgRect.Top);
  var left = Convert.ToInt32(imgRect.Left);
  var width = Convert.ToInt32(imgRect.Width);
  var height = Convert.ToInt32(imgRect.Height);

  var rect = new Leadtools.LeadRect(left, top, width, height);
  var cmd = new Leadtools.ImageProcessing.CropCommand(rect);
  cmd.Run(img);

  _codecs.Save(img, @"c:\temp\test.tif",
    RasterImageFormat.CcittGroup4, 1, 1, 1, -1, CodecsSavePageMode.Append);
}
...