如何在C#窗口应用程序中进行自由手图像裁剪?
答案 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 *