如何通过矩形从pictureBox中剪切图片

How to cut picture from pictureBox by rectangle on it

我需要使用我在这个图片框中的矩形从图片框中剪切部分图片。现在我将图像加载到图片框(并将其缩放到图片框)并在图片框内绘制可调整大小的矩形,但我不知道如何通过该矩形剪切例如图片框的左下角。

编辑

Example 我需要用这个矩形切割轮子并将其保存为 jpeg 但是这个矩形不是静态的。

我不能完全确定我是否理解您的全部要求,但是您可以使用 BitMap 的克隆方法来裁剪图像。例如,这会在一个 pictureBox1 中裁剪图像并将其加载到 pictureBox2:

using (Bitmap bmp = new Bitmap(pictureBox1.Image))
{
    var newImg = bmp.Clone(
        new Rectangle { X = 10, Y = 10, Width = bmp.Width / 2, Height = bmp.Height / 2 }, 
        bmp.PixelFormat);
    pictureBox2.Image = newImg;
}

操作图像时很容易泄露句柄。您以后需要小心处理 pictureBox2.Image,尤其是当您多次重新加载图像时。

假设您可以创建矩形并对其进行处理(将其绘制在图片框上,计算其面积...):

    private static Image CropImage(Image img, Rectangle cropArea)
    {
        try {
            Bitmap bmpImage = new Bitmap(img);
            Bitmap bmpCrop = bmpImage.Clone(cropArea /*your rectangle area*/, bmpImage.PixelFormat);
            return (Image)(bmpCrop);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "CropImage()");
        }
        return null;
    }

    private void saveJpeg(string path, Bitmap img, long quality)
    {
        EncoderParameter qualityParam = new EncoderParameter(
                System.Drawing.Imaging.Encoder.Quality, (long)quality);

        ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg");

        if (jpegCodec == null)
        {
            MessageBox.Show("Can't find JPEG encoder?", "saveJpeg()");
            return;
        }
        EncoderParameters encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = qualityParam;

        img.Save(path, jpegCodec, encoderParams);
    }

    private ImageCodecInfo getEncoderInfo(string mimeType)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];

        return null;
    }

    private void btnPerformSaveImage_Click(object sender, EventArgs e)
    {
        try
        {
            Image img = (Bitmap)CropImage(new Bitmap(pictureBox1.Image, pictureBox1.Size), CropRect);
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "btnOK_Click()");
        }
    }