Использование прямоугольника для создания области поиска на изображении - PullRequest
3 голосов
/ 06 января 2012

У меня есть средство просмотра изображений, которое отображает изображение. Я хочу нарисовать прямоугольник, используя мышь над изображением, и получить координаты x и y прямоугольника (X1, X2, Y1 и Y2). Я буду использовать эти координаты, чтобы создать область поиска и найти максимальные и минимальные значения в массиве с точным количеством пикселей в качестве изображения по обеим осям.
Может кто-нибудь направить меня в направлении, чтобы начать, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 06 января 2012

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

Пример:

MainWindow.xaml:

<Window x:Class="CanvasRectangleSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow">
    <Grid>
        <Canvas x:Name="SampleImageCanvas" 
                MouseMove="SampleImageCanvas_MouseMove" 
                MouseDown="SampleImageCanvas_MouseDown"
                Width="512" Height="389"> 
            <Canvas.Background>
                <!--Here you set the image to display -> You probably want to bind it to something. -->
                <ImageBrush x:Name="SampleImage" Stretch="Uniform" ImageSource="C:\Users\Public\Pictures\Sample Pictures\Koala.jpg">
                </ImageBrush>
            </Canvas.Background>
            <!-- Here you draw whatever you want on the canvas. -->
            <!-- You'll probably want to bind its width and height to something too. -->
            <Rectangle x:Name="ROI" Stroke="#FFF1133E"  Width="50" Height="50"/>
        </Canvas>
    </Grid>
</Window>

MainWindow.xaml.cs:

using System.Windows;
using System.Windows.Input;
using System.Windows.Controls;
namespace CanvasRectangleSample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.DataContext = this;
            InitializeComponent();
        }

        // Handling the redrawing of the rectangle according to mouse location
        private void SampleImageCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            //get mouse location relative to the canvas
            Point pt = e.MouseDevice.GetPosition(sender as Canvas);

            //here you set the rectangle loction relative to the canvas
            Canvas.SetLeft(ROI, pt.X - (int)(ROI.Width / 2));
            Canvas.SetTop(ROI, pt.Y - (int)(ROI.Height / 2));
        }


        private void SampleImageCanvas_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //Here you should handle saving the rectangle location

            //don't forget to calculate the proportion between Canvas's size and real Image's size.

        }
    }

}

Если вы хотите, вы можете ограничить перемещение прямоугольника областью холста с помощью выражения if, проверяющего, содержит ли область холста расположение мыши

1 голос
/ 07 января 2012

Спасибо за указатели и помощь: вот мой законченный код, и он работает.Вы помещаете мышь в любое место на холсте, удерживая мышь и перетаскивая, чтобы создать прямоугольник.Для перетаскивания и создания прямоугольника в любом направлении можно использовать некоторые улучшения.

XAML:

<Canvas Name="ImageCanvas"
           MouseMove="ImageCanvas_MouseMove"
               MouseDown="ImageCanvas_MouseDown"
           Height="240" Width="320"
           HorizontalAlignment="Left"
           Margin="87,514,0,0"  VerticalAlignment="Top" MouseLeftButtonUp="ImageCanvas_MouseLeftButtonUp">
           <Canvas.Background>
           <ImageBrush x:Name="Image" Stretch="Uniform" ImageSource="C:\image.bmp">
           </ImageBrush>
           </Canvas.Background>
           <Rectangle x:Name="ROI" Stroke="#FFF1133E"  Width="20" Height="20" Canvas.Left="155" Canvas.Top="115" />

       </Canvas>

Код:

double topLeftX = 0;
double topLeftY = 0;
double bottomRightX = 0;
double bottomrigthY = 0;
bool setRect = false;

private void ImageCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
    topLeftY = topLeftX = bottomrigthY = bottomRightX = 0;
    setRect = true;
    System.Windows.Point pt = e.MouseDevice.GetPosition(sender as Canvas);
    topLeftX = pt.X; topLeftY = pt.Y;
}

private void ImageCanvas_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    if (setRect == true)
    {
        //get mouse location relative to the canvas
        System.Windows.Point pt = e.MouseDevice.GetPosition(sender as Canvas);
        Canvas.SetLeft(ROI, topLeftX);
        Canvas.SetTop(ROI, topLeftY);
        ROI.Width = System.Math.Abs((int)(pt.X - topLeftX));
        ROI.Height = System.Math.Abs((int)(pt.Y - topLeftY));
        commandReturnTB.Text = (Convert.ToString(pt.X) + "," + Convert.ToString(pt.Y))+"\n";  
    }
}

private void ImageCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    System.Windows.Point pt = e.MouseDevice.GetPosition(sender as Canvas);
    bottomRightX = pt.X;
    bottomrigthY = pt.Y;
    ROI.Width = System.Math.Abs((int)(bottomRightX - topLeftX));
    ROI.Height = System.Math.Abs((int)(bottomrigthY - topLeftY));
    Canvas.SetLeft(ROI, topLeftX);
    Canvas.SetTop(ROI, topLeftY);
    setRect = false;
    commandReturnTB.Text = topLeftX + "," + topLeftY + "--" + bottomRightX + "," + bottomrigthY;
}
...