C# ImageBox 在 MouseUp 上清除矩形

2024-04-04

我有一个面板,其中包含在运行时创建的多个图片框。

用户将在任何图片框上创建一个矩形,所选部分将显示在预览图片框上。

我已经使用下面的代码成功完成了上述操作。

Question

  1. 我想在 mouseup 事件中清除选择矩形。使用无效但不起作用。 从如何清除图片框中的图形(矩形) https://stackoverflow.com/questions/10442279/how-to-clear-the-graphicsrectangle-shape-in-picturebox
  2. 另外,当我滚动面板时,所有图片框上都会显示相同的矩形(鼠标选择)。

        private void Picture_Paint(object sender, PaintEventArgs e)
    {
        if (Rect!=null && Rect.Width>0 && Rect.Height>0)
        {
            e.Graphics.FillRectangle(selectionBrush, Rect);
        }
    }
    
    private void Picture_MouseDown(object sender, MouseEventArgs e)
    {
        RecStartpoint = e.Location;
        ((PictureBox)sender).Invalidate();
    }
    
    private void Picture_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left) return;
    
        Point tempEndPoint = e.Location;
        Rect.Location = new Point(
            Math.Min(RecStartpoint.X, tempEndPoint.X),
            Math.Min(RecStartpoint.Y, tempEndPoint.Y));
        Rect.Size = new Size(
            Math.Abs(RecStartpoint.X - tempEndPoint.X),
            Math.Abs(RecStartpoint.Y - tempEndPoint.Y));
        ((PictureBox)sender).Invalidate();
    }
    
    private void Picture_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button != MouseButtons.Left) return;
    
        PictureBox org_pic = (PictureBox)(sender);
    
        Point RecEndpoint=e.Location;
    
    
        int xDown = Math.Min(RecStartpoint.X,RecEndpoint.X);
        int yDown = Math.Min(RecStartpoint.Y, RecEndpoint.Y);
        int xUp = Math.Max(RecStartpoint.X,RecEndpoint.X);
        int yUp = Math.Max(RecStartpoint.Y,RecEndpoint.Y);
    
        Rectangle rec = new Rectangle(xDown, yDown, Math.Abs(xUp - xDown), Math.Abs(yUp - yDown));
    
        xDown = xDown * org_pic.Image.Width / org_pic.Width;
        yDown = yDown * org_pic.Image.Height / org_pic.Height;
    
        xUp = xUp * org_pic.Image.Width / org_pic.Width;
        yUp = yUp * org_pic.Image.Height / org_pic.Height;
    
        rectCropArea = new Rectangle(xDown, yDown, Math.Abs(xUp - xDown), Math.Abs(yUp - yDown));
    
        pictureBox_preview_photo.Refresh();
        Bitmap sourceBitmap = new Bitmap(org_pic.ImageLocation);
        Graphics g = pictureBox_preview_photo.CreateGraphics();
        g.DrawImage(sourceBitmap, new Rectangle(0, 0, pictureBox_preview_photo.Width, pictureBox_preview_photo.Height), rectCropArea, GraphicsUnit.Pixel);
    
    }
    

我会尝试这种方法:

首先,使Image变量,在形式范围内

public partial class Form1 : Form
{
    //variable for holding original image, before rectangle is drawn on it
    Image originalImage = null;

    public Form1()
    {
        InitializeComponent();
    }
    //rest of form's code...

其次,将当前图片保存在该变量中MouseDown

private void Picture_MouseDown(object sender, MouseEventArgs e)
{
    //save it
    startImage = ((PictureBox)sender).Image;
    RecStartpoint = e.Location;
    ((PictureBox)sender).Invalidate();
}

最后,在结束时MouseUp事件、设置Rectangle的宽度和高度为零并恢复保存的原始图像

//snipped code
pictureBox_preview_photo.Refresh();
Bitmap sourceBitmap = new Bitmap(org_pic.ImageLocation);
Graphics g = pictureBox_preview_photo.CreateGraphics();
g.DrawImage(sourceBitmap, new Rectangle(0, 0, pictureBox_preview_photo.Width, pictureBox_preview_photo.Height), rectCropArea, GraphicsUnit.Pixel);

//make rectangle's widht and height 0 so that Paint event won't draw it
Rect.Width = Rect.Height = 0;
//restore image
this.Picture.Image = startImage;

我不明白第二个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# ImageBox 在 MouseUp 上清除矩形 的相关文章

  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 如何通过覆盖 MSBuild 目标来防止外语资源生成?

    我正在致力于减少大型 C ASP NET 解决方案的编译时间 我们的解决方案使用通常的 resx 文件方法翻译成大约十几种外语 这些资源文件的解析和编译极大地减慢了我们的编译时间 并且是日常的挫败感 我知道可以创建自定义资源提供程序并摆脱
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 使用 dateTimePicker 在 DataGridView 中编辑日期

    我有一个DateTime我的 WinForms 中的专栏DataGridView 目前只能通过手动输入日期来编辑该字段 例如 2010 09 02 需要什么才能拥有一个DateTimePicker 或同等 用作编辑器 DataGridVie
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有

随机推荐

  • Cassandra 中的 RPC 超时

    我收到以下错误 cqlsh dev gt SELECT DISTINCT id FROM raw data Request did not complete within rpc timeout 这是一个我永远不会再进行的特殊查询 我不在乎
  • 新上传的版本未在 App Store Connect 中显示或处理

    我在过去 48 小时内上传了多个版本 但没有一个在 App Store Connect 中出现或处理 构建已通过 Xcode 成功上传 还有其他人经历过这种情况并知道潜在的解决方案吗 我已向 Apple 提交了支持票 但我希望能更快得到解决
  • 在 Java EE7 项目中找不到 web.xml

    我正在 eclipse 中使用 JSF 2 2 和 Servlet 3 1 Java EE7 做一个项目 我遇到的第一个问题是 pom xml 中的错误
  • 最有效的便携式溢出检测? [复制]

    这个问题在这里已经有答案了 与 C C 和 D 等金属语言类似 检测无符号 64 位溢出的最有效 合理可移植的方式是什么 即不使用汇编程序 尽管您可能假设二进制补码算术和环绕行为 乘法中的整数 通过将无符号类型可表示的最大值除以被乘数之一
  • 在 .NET 中使用 RPC/编码的 SOAP Web 服务时出错

    我在调用 Web 服务方法时收到以下错误 无法将 System Xml XmlNode 类型的对象分配给 System String 类型的对象 Web 服务是 PHP 服务 我使用此处定义的 wsdl 文档中的 wsdl exe 创建了我
  • 从 C# 对象自动生成 javascript 对象模型

    寻找现有的 经过验证的解决方案来快速生成客户端JavaScript 对象模型代表一个现有的 C 对象 我想象有一个 T4 模板或其他一些方法 但我缺乏找到它的术语 我不是在讨论序列化以获取现有 C 对象实例的 JSON 表示形式或任何与反序
  • 如何将字符串转换为安全的 SQL 字符串?

    我正在从一堆文本文件生成一些 sql 插入语句 这些文本文件通常是用户输入数据 我想清理这些数据 这样就不会破坏插入语句 例如 在某些输入数据中 人们使用了 Don t 一词 don t中的 会导致sql语句认为字符串已经结束 从而导致错误
  • 如何正确使用 oembed 从 youtube 中提取拇指

    我的主页上有很多来自 YouTube 视频的点赞 我使用下面的这个函数从 youtube url 中抓取拇指 它运行速度很快 但它不适用于像 youtu be JSHDLSKL 这样的缩写形式的 url function get youtu
  • JSF 和 Facelets 文件的自动重新加载

    我在使用 JRebel Spring JSF Mojarra 2 0 3 和 WebLogic 10 3 热重载 Facelets 文件时遇到了一些问题 JRebel 成功重新加载 WebContent 下的常规 Java 类和 js cs
  • System.Diagnostics.Process.Start 奇怪的行为

    我正在用 C 编写一个应用程序来启动和监视其他应用程序 我使用 System Diagnostics Process 类启动应用程序 然后使用 Process Responding 属性每 100 毫秒轮询一次应用程序的状态来监视应用程序
  • 将双精度十进制转换为十六进制、二进制和八进制字符串

    是否有一个自定义或标准库可以与 Objective C 一起使用 将十进制浮点值转换为十六进制 二进制和八进制 NSString 我一直在四处寻找 但只能找到如何通过使用以下方法转换另一个方向 从其他方向转换为十进制 double resu
  • 数组排序不起作用

    我有一组对象正在尝试排序 但它似乎不起作用 数组中的某些对象具有orderNum我要排序的属性 但并不是所有的物体都具有这个属性 我想要带有以下内容的对象orderNum要排序到数组顶部位置的属性 这是我尝试过的小提琴 http jsfid
  • Android 材料设计复制工具栏面包屑示例

    我正在尝试复制面包屑示例 我已经将 TextView 添加到工具栏 但无法完全复制工具栏样式的字体 大小 颜色 并且无法让面包屑从屏幕左侧浮动 您将需要创建自己的面包屑视图并将其添加到工具栏中 也许基于现在已弃用的碎片面包屑 https d
  • React Native 的 panResponder 的 useState 的价值已经过时了吗?

    我需要读取的值useState in onPanResponderMove 页面加载时onPanResponderMove正确记录初始值0 但是当我点击之后TouchableOpacity增加foo the onPanResponderMo
  • 如何合并所有子目录中同名的文本文件?

    我有几个包含文件的文件夹 文件可以具有相同的名称 我想将文件连接到每个名称之一 提前致谢 EDIT 抱歉 您能给我看一下它的批处理文件吗 合并 bat echo off for every text file in the sub dirs
  • 是一个在给定上下文错误中无效的“方法”

    这是 Head First CSharp 第 113 页 的示例 我收到以下错误 错误 1 Guys Form1 joesCashLabel object System EventArgs 是一种 方法 在给定上下文中无效 c temp G
  • Instagram 的 GET/tags//media/recent 分页实际上是如何工作的?

    我正在尝试使用实时照片更新 http instagram com developer realtime 用于获取带有特定标签的所有图片的 API 因为此 API 的更新实际上只告诉您that新内容存在 但不存在 what是的 每当我收到某些
  • 同一命名空间中的包:无法在安装脚本中导入模块

    我很好奇下面的情况 假设我有两个名为project alpha and project bravo 都定义了顶级命名空间包mymeta 布局 project alpha gt mymeta gt init py gt project alp
  • NamedParameterJdbcTemplate - 从以下位置选择 *

    在 Spring 的 NamedParameterJdbcTemplate 中 如何使用 Spring 版本 3 1 x 执行 Select from Student 的查询以返回列表而不提供任何参数 根据http docs spring
  • C# ImageBox 在 MouseUp 上清除矩形

    我有一个面板 其中包含在运行时创建的多个图片框 用户将在任何图片框上创建一个矩形 所选部分将显示在预览图片框上 我已经使用下面的代码成功完成了上述操作 Question 我想在 mouseup 事件中清除选择矩形 使用无效但不起作用 从如何