You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Paint事件中绘制随鼠标移动的圆形实时裁剪图像?

解决实时圆形裁剪图像随鼠标移动的问题

你的问题核心是修改后的代码把实时绘制位置固定成了(0,0),完全丢弃了原来和鼠标坐标绑定的realTimeCursorPos。只要把绘制位置和圆形路径区域都关联到鼠标坐标上就能解决,具体修改如下:

修改后的完整Paint事件代码

private void pictureBoxCroppedImages_Paint(object sender, PaintEventArgs e)
{
    if (drawBorder)
    {
        ControlPaint.DrawBorder(e.Graphics, pictureBoxCroppedImages.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);
    }

    if (!isRealTimeCropping)
    {
        if (rectImage != null && DrawingRects.Count > 0)
        {
            var dr = DrawingRects.Last();
            e.Graphics.DrawImage(rectImage, dr.Rect);

            if (clearRectangles)
            {
                DrawingRects.Clear();
                pictureBoxImageToCrop.Invalidate();
            }
        }
    }

    if (isRealTimeCropping && realTimeCroppedImage != null)
    {
        // Handle cropping shape based on radio button selection
        if (radioButtonRectangular.Checked)
        {
            // 恢复鼠标位置绑定的绘制逻辑
            e.Graphics.DrawImage(realTimeCroppedImage, realTimeCursorPos);
        }
        else if (radioButtonCircular.Checked)
        {
            // 保存当前Graphics状态,避免裁剪区域影响后续绘制
            var originalState = e.Graphics.Save();
            
            using (GraphicsPath path = new GraphicsPath())
            {
                // 创建跟随鼠标坐标的圆形区域
                var circleRect = new Rectangle(
                    realTimeCursorPos.X, 
                    realTimeCursorPos.Y, 
                    realTimeCroppedImage.Width, 
                    realTimeCroppedImage.Height);
                path.AddEllipse(circleRect);
                e.Graphics.SetClip(path);
                // 把图像绘制到鼠标对应的位置
                e.Graphics.DrawImage(realTimeCroppedImage, circleRect.Location);
            }
            
            // 恢复Graphics原始状态,避免影响其他绘制内容
            e.Graphics.Restore(originalState);
        }
    }
}

关键改动说明

  • 矩形绘制:把固定的(0,0)改回realTimeCursorPos,直接恢复鼠标跟随功能
  • 圆形绘制:
    1. 椭圆的矩形区域基于realTimeCursorPos创建,确保圆形边框跟着鼠标移动
    2. 绘制图像时使用鼠标坐标作为起点,保证图像位置和圆形区域对齐
    3. 增加Graphics.Save()和Restore()操作,防止设置的裁剪区域干扰Paint事件里的其他绘制(比如边框、非实时裁剪图像)

修改完成后,矩形和圆形裁剪的图像都能正常跟随鼠标实时移动了。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:30:23