Для того чтобы на контроле Image WPF нарисовать прямоугольник мышкой и получить значения его пикселей, вам необходимо использовать WPF события мыши и работать с объектом System.Windows.Media.Imaging.WriteableBitmap
.
1. Создайте новый проект WPF в Visual Studio.
2. В XAML разметке добавьте контрол Image:
<Window x:Class="YourNamespace.YourClass" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="450" Width="800"> <Grid> <Image x:Name="imageControl" MouseLeftButtonDown="ImageControl_MouseLeftButtonDown" /> </Grid> </Window>
3. В коде обработчика события MouseLeftButtonDown
привяжите изображение к WriteableBitmap
и начните отслеживать перемещение мыши:
c#
private WriteableBitmap writeableBitmap;
private CroppedBitmap croppedBitmap;
private Point startPoint;
private Rectangle selectionRectangle;
public MainWindow()
{
InitializeComponent();
// Получите изображение из ресурсов проекта или другим способом.
BitmapImage bitmapImage = new BitmapImage(new Uri("path/to/your/image.jpg", UriKind.Relative));
// Привязка изображения к контролу Image.
imageControl.Source = bitmapImage;
// Создание экземпляра WriteableBitmap на основе изображения.
writeableBitmap = new WriteableBitmap(bitmapImage);
}
private void ImageControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(imageControl);
// Создание прямоугольника выделения.
selectionRectangle = new Rectangle
{
Stroke = Brushes.Red,
StrokeThickness = 2
};
// Добавление прямоугольника выделения на Grid.
((Grid)imageControl.Parent).Children.Add(selectionRectangle);
// Обработка события перемещения мыши.
imageControl.MouseMove += ImageControl_MouseMove;
// Обработка события отпускания кнопки мыши.
imageControl.MouseLeftButtonUp += ImageControl_MouseLeftButtonUp;
}
private void ImageControl_MouseMove(object sender, MouseEventArgs e)
{
// Размер и позиция прямоугольника выделения.
double width = e.GetPosition(imageControl).X - startPoint.X;
double height = e.GetPosition(imageControl).Y - startPoint.Y;
double x = startPoint.X;
double y = startPoint.Y;
// Обновление размера и позиции прямоугольника выделения.
selectionRectangle.Width = Math.Abs(width);
selectionRectangle.Height = Math.Abs(height);
Canvas.SetLeft(selectionRectangle, x);
Canvas.SetTop(selectionRectangle, y);
}
private void ImageControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
// Удаление обработчика события перемещения мыши.
imageControl.MouseMove -= ImageControl_MouseMove;
// Получение координат и размера прямоугольника выделения.
double x = Canvas.GetLeft(selectionRectangle);
double y = Canvas.GetTop(selectionRectangle);
double width = selectionRectangle.Width;
double height = selectionRectangle.Height;
// Создание вырезанного изображения.
croppedBitmap = new CroppedBitmap(
writeableBitmap,
new Int32Rect((int)x, (int)y, (int)width, (int)height));
// Получение пикселей вырезанного изображения.
byte[] pixelData = new byte[(int)(width * height * 4)];
croppedBitmap.CopyPixels(pixelData, (int)(width * 4), 0);
// Обработка полученных пикселей.
// В pixelData находятся значения RGB каждого пикселя.
// Можете сделать с ними что угодно, например, вывести на консоль или сохранить в файл.
// Удаление прямоугольника выделения.
((Grid)imageControl.Parent).Children.Remove(selectionRectangle);
}
Вот и все. Теперь при нажатии левой кнопкой мыши пользователь может нарисовать прямоугольник на изображении, а после отпускания кнопки мыши вы вырежете этот прямоугольник из исходного изображения и получите значения пикселей.