我创建了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。对于我所缺少的任何帮助,将不胜感激。
答案 0 :(得分:1)
问题是ImageViewer UserRectangle边界返回“控制”坐标中的坐标,您需要将其转换为“裁剪”命令正在寻找的“图像坐标”。
根据此处的文档: 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);
}