如何在C#窗口应用程序中进行自由手图像裁剪?

时间:2011-03-02 12:19:46

标签: c# image-manipulation

如何在C#窗口应用程序中进行自由手图像裁剪?

2 个答案:

答案 0 :(得分:3)

好的,您提供了非常少量的信息,但我会假设您使用的是winforms。有些任务涉及徒手技术,例如:

  • 图纸
  • 将正下落
  • 裁剪
  • 选择

他们都非常相似。我们假设您有一个PictureBox,并希望在其中裁剪图像。

// Current selection
private Rectangle _cropRectangle;
// Starting point
private Point _cropStart;
// Dragging flag
private bool _isDragging;

private void pBox_MouseDown(object sender, MouseEventArgs e)
{
    _cropRectangle = new Rectangle(e.X, e.Y, 0, 0);
    _isDragging = true;
}

private void pBox_MouseUp(object sender, MouseEventArgs e)
{
    _isDragging = false;
}

private void pBox_MouseMove(object sender, MouseEventArgs e)
{
    if (!_isDragging)
        return;

    _cropRectangle = new Rectangle(Math.Min(_cropStart.X, e.X),
                                   Math.Min(_cropStart.Y, e.Y),
                                   Math.Abs(e.X - _cropStart.X),
                                   Math.Abs(e.Y - _cropStart.Y));
    pBox.Invalidate();
}

private void pBox_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawRectangle(Pens.Red, _cropRectangle);
}

会发生什么:我使用了三个鼠标事件( MouseDown MouseUp MoseMove )和 Paint 事件。基本上,无论何时你想从上面的列表中做任何事情,你都可以处理这四个事件。

我试图保持代码简短且不言自明。有四个事件处理程序使用三个实例字段。这些字段用于存储拖动过程的当前状态。

随意自定义代码,尤其是pBox_Paint处理程序。我只是在选定区域周围绘制一个薄的红色矩形。你可能想在这里做一些更详细的事情。

每当您完成矩形后,您可以调用Crop方法:

private Image Crop()
{
    Bitmap croppedImage = new Bitmap(_cropRectangle.Width, _cropRectangle.Height);
    using (Graphics g = Graphics.FromImage(croppedImage))
    {
        g.DrawImage(pBox.Image, 0, 0, _cropRectangle, GraphicsUnit.Pixel);
    }
    return croppedImage;
}

它创建一个新的Bitmap并将选定的源图像部分放入其中。返回的Image对象可能以您喜欢的任何方式使用。

编辑:试图简化代码我之前犯了一些错误,现在修复。

答案 1 :(得分:0)

您可以使用Graphics.DrawImage从位图中将裁剪后的图像绘制到图形对象上。

Rectangle cropRect = new Rectangle(...);
Bitmap src = Image.FromFile(fileName) as Bitmap;
Bitmap target = new Bitmap(cropRect.Width, cropRect.Height);

using(Graphics g = Graphics.FromImage(target))
{
   g.DrawImage(src, cropRect, 
                    new Rectangle(0, 0, target.Width, target.Height),
                    GraphicsUnit.Pixel);
}

您也可以参考完整代码.... 请参阅* Link *