【问题标题】:How to cut picture from pictureBox by rectangle on it如何通过矩形从pictureBox中剪切图片
【发布时间】:2015-11-08 14:20:50
【问题描述】:

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

编辑

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

【问题讨论】:

    标签: c# winforms picturebox rectangles


    【解决方案1】:

    我不完全确定我了解您的全部要求,但您可以使用 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,尤其是在您多次重新加载图像时。

    【讨论】:

    • 好的,但是它会切掉我用可移动矩形指向的那部分吗?例如,我可以用鼠标矩形(我有那个部分)和这个矩形从图片框中的照片中剪切面并用我的尺寸保存吗?
    • 是的,您可以调整代码片段来做到这一点。在我的示例中,我在坐标 X=10、Y=10 处进行裁剪,因此您可以将这些值替换为可移动矩形相对于图片的位置。接下来的两个参数是宽度和高度,因此您将使用内部矩形的宽度和高度。
    • 非常感谢菲尔,这就是我想要的。如果我可以问最后一个问题,如何剪切图片 400x400 并将其保存到图像 200x200 或我设置的其他图像?因为我调整了矩形的大小,并被它剪切了,但我需要将部分图像保存到定义大小的文件中。我应该将其设置为保存方法还是裁剪?
    • 调整大小可以像使用位图构造函数重载一样简单:new Bitmap(Image, Size) 如果质量不重要。如需更复杂的大小调整,请查看this question。我建议将你的调整大小操作包装在它自己的函数中,并在调用 Save 之前应用它,因为确保每个函数都有一个目的是一种很好的做法。
    【解决方案2】:

    假设你可以创建你的矩形并处理它(在你的图片框上绘制它,计算它的面积......):

        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()");
            }
        }
    

    【讨论】:

    • Ps:在发帖前尝试谷歌搜索寻求帮助。以上代码由this example修改供个人使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多