Обрезка изображения с произвольным прямоугольником - PullRequest
2 голосов
/ 31 октября 2011

Я создаю приложение для сканирования изображений с помощью WIA.Но мои изображения имеют много неиспользуемого пространства, если размер отсканированного документа не большой.Мне нужно обрезать это неиспользуемое пространство, как в Paint с помощью курсора и прямоугольника.Как это сделать в WPF?Код обрезки изображения:

private static Image cropImage(Image img, Rectangle cropArea)
{
 Bitmap bmpImage = new Bitmap(img);
 Bitmap bmpCrop = bmpImage.Clone(cropArea,bmpImage.PixelFormat);
 return (Image)(bmpCrop);
}

Ответы [ 2 ]

5 голосов
/ 31 октября 2011

Поместите элемент управления Image в Canvas и добавьте невидимый прямоугольник на холст.

При нажатии левой кнопки мыши установите верхний левый угол прямоугольника в координатах мыши и сделайте его видимым.

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

Пример:

<Window x:Class="TestWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestWpfApplication"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Canvas MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
            MouseMove="Canvas_MouseMove"
            Background="AntiqueWhite">
        <Image Width="500"
               Height="300" />
        <Rectangle x:Name="selectionRectangle"
                   StrokeThickness="1"
                   Stroke="LightBlue"
                   Fill="#220000FF"
                   Visibility="Collapsed" />
    </Canvas>

</Window>

И код позади:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace TestWpfApplication
{
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var mousePosition = e.GetPosition(sender as UIElement);
            Canvas.SetLeft(selectionRectangle, mousePosition.X);
            Canvas.SetTop(selectionRectangle, mousePosition.Y);
            selectionRectangle.Visibility = System.Windows.Visibility.Visible;
        }

        private void Canvas_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                var mousePosition = e.GetPosition(sender as UIElement);
                selectionRectangle.Width = mousePosition.X - Canvas.GetLeft(selectionRectangle);
                selectionRectangle.Height = mousePosition.Y - Canvas.GetTop(selectionRectangle);
            }
        }
    }
}

Обратите внимание, что Canvas будет реагировать на щелчок только тогда, когда у него есть цвет.

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

0 голосов
/ 29 октября 2013

Спасибо за этот код. Мои настоящие проблемы перешли в CROP iamge show в другом элементе управления iamge. Как это возможно в WPF. Пожалуйста, пройдите по этой ссылке.

http://social.msdn.microsoft.com/Forums/en-US/302bb1c8-e272-48b1-982d-12cf2aefe8a3/how-to-crop-image-show-in-another-image-control-?forum=wpf

Спасибо

...