自定义矩形的图像裁剪

时间:2011-10-31 14:24:58

标签: c# .net wpf crop

我正在使用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 个答案:

答案 0 :(得分:5)

将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只有在有颜色时才会响应。

另外:您需要处理用户从右到左和/或从下到上拖动选择的情况,因为这会为矩形的宽度和高度引入负尺寸。但我会把它留给你。

答案 1 :(得分:-2)

感谢您提供此代码。我在CROP图像中的实际问题显示在另一个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

感谢