【问题标题】:Image crop with custom rectangle使用自定义矩形裁剪图像
【发布时间】:2011-10-31 14:24:57
【问题描述】:

我正在使用 WIA 创建用于图像扫描的应用程序。但是如果扫描的文档尺寸不大,我的图像有很多未使用的空间。我需要裁剪未使用的空间,例如使用十字光标和矩形绘制。如何在 WPF 中做到这一点? 图片裁剪代码为:

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

【问题讨论】:

  • 是什么阻碍了你?您是否正在寻找一种在图像上绘制选区的方法?您发布的代码不起作用吗?
  • 是的,我正在寻找绘制选择的方法

标签: c# .net wpf crop


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!为我工作。
【解决方案2】:

感谢此代码。我与 CROP iamge 相关的实际问题显示在另一个 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

谢谢

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多