我正在使用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);
}
答案 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中怎么可能。请休息这个链接。
感谢