更新了更新的代码。
但由于某种原因,它仍然无法正常工作。如果坐标是位图坐标,那可能是什么原因?我放在这里的第一个代码示例无法正常工作,第二个代码示例给出了OutOfMemoryException。
我在尝试在两点之间裁剪图像时遇到了问题。在我的项目中,我有一个pictureBox(名为AP),一般的想法是用户点击两个点,程序在这两个角之间裁剪图像。我已经尝试了两种方法,一种是使用Bitmap.Crop,另一种是使用Graphics.DrawImage,但是两者似乎都因为同样的原因而失败并且根本不起作用(裁剪了图像的一小部分)。
代码:
private void AP_Click(object sender, EventArgs e)
{
// Setting the corners
else if (mark_shape == 0)
{
var mouseEventArgs = e as MouseEventArgs;
if (picture_corners_set == 0)
{
northEast = AP.PointToClient(new Point(mouseEventArgs.X, mouseEventArgs.Y));
picture_corners_set = 1;
}
else if (picture_corners_set == 1)
{
southWest = AP.PointToClient(new Point(mouseEventArgs.X, mouseEventArgs.Y));
Rectangle imageRectangle = new Rectangle(southWest.X, northEast.Y, (northEast.X - southWest.X), (southWest.Y - northEast.Y));
var bmp = new Bitmap(imageRectangle.Width, imageRectangle.Height);
using (var gr = Graphics.FromImage(bmp))
{
gr.DrawImage(AP.Image, 0, 0, imageRectangle, GraphicsUnit.Pixel);
}
AP.Image = bmp;
enableAllButtons();
}
}
}
答案 0 :(得分:0)
由于您的裁剪位图图像大小与用户选择的宽度/高度相同,我猜测您希望裁剪后的图像位于新位图的顶部/左侧并填充它。事实上,你告诉DrawImage()方法在同一位置绘制Bitmap的那部分,尽管是一个较小的Bitmap。
执行此操作的正确方法是在(0,0)处绘制源矩形图像:
private Point pt1, pt2;
private void AP_Click(object sender, EventArgs e)
{
// ... obviously other code here ...
else if (mark_shape == 0) // Setting the corners
{
Point pt = AP.PointToClient(Cursor.Position);
if (picture_corners_set == 0)
{
pt1 = new Point(pt.X, pt.Y);
picture_corners_set = 1;
}
else if (picture_corners_set == 1)
{
pt2 = new Point(pt.X, pt.Y);
picture_corners_set = 0;
Rectangle imageRectangle = new Rectangle(new Point(Math.Min(pt1.X, pt2.X), Math.Min(pt1.Y, pt2.Y)), new Size(Math.Abs(pt2.X - pt1.X) + 1, Math.Abs(pt2.Y - pt1.Y) + 1));
var bmp = new Bitmap(imageRectangle.Width, imageRectangle.Height);
using (var gr = Graphics.FromImage(bmp))
{
gr.DrawImage(AP.Image, 0, 0, imageRectangle, GraphicsUnit.Pixel);
}
AP.Image = bmp;
enableAllButtons();
}
}
}
您可以使用其他几个重载进行此操作,但上面的重载非常清楚{0}正在绘制imageRectangle
。