裁剪图像两点 (C#)

本文关键字:两点 图像 裁剪 | 更新日期: 2023-09-27 18:17:41

更新:

添加了更新的代码。

但是由于某种原因,它仍然无法正常工作。如果坐标是位图坐标,可能是什么原因?我放在这里的第一个代码示例无法正常工作,第二个示例给了我一个 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();
            }
        }
    }

裁剪图像两点 (C#)

由于裁剪的位图图像大小与用户选择的宽度/高度相同,因此我猜您希望裁剪的图像位于新位图的顶部/左侧并填充它。 实际上,您告诉 DrawImage(( 方法在同一位置绘制位图的该部分,尽管在较小尺寸的位图中。

执行此操作的正确方法是在 (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();
            }
        }
    }

您可以使用其他几个重载来执行此操作,但上面的重载非常清楚地表明imageRectangle是在 (0, 0( 处绘制的。