如何使用半透明选择器选择屏幕上任意位置的颜色?

2023-11-30

小免责声明:这是我第一次在表单中搞乱图形,因此我对这里的概念不太熟悉

好吧,所以我一直在尝试制作一个应用程序来跟踪光标在整个屏幕中的位置并在其周围绘制一个椭圆。我借用的代码来自this问题(我更改了椭圆的 X 和 Y 位置,以便在光标周围自动调整自身,无论其大小如何)到目前为止,一切都完美。这是到目前为止的代码:

        public static float width;
        public static float height;

        public Main(float w, float h)
        {
            InitializeComponent();
            this.DoubleBuffered = true;
            width = w;
            height = h;
            BackColor = Color.White;
            FormBorderStyle = FormBorderStyle.None;
            Bounds = Screen.PrimaryScreen.Bounds;
            TopMost = true;
            TransparencyKey = BackColor;
            this.ShowInTaskbar = false;
            timer1.Tick += timer1_Tick;
        }

        Timer timer1 = new Timer() { Interval = 1, Enabled = true };

        protected override void OnPaint(PaintEventArgs e)
        {
            DrawTest(e.Graphics);
            base.OnPaint(e);
        }

        private void DrawTest(Graphics g)
        {
            var p = PointToClient(Cursor.Position);
            g.DrawEllipse(Pens.DeepSkyBlue, p.X - (width / 2), p.Y - (height / 2), width, height);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Invalidate();
        }

所以现在我希望应用程序检查椭圆区域内是否存在预先分配的颜色,如果存在,则获取距具有该颜色的光标最近的像素的位置。我到处搜索过,但没有找到任何方法。

我知道它背后的逻辑是获取椭圆内的所有像素,检查颜色是否存在并找到最接近光标的该颜色的一个像素,但我无法实现它。

任何帮助将不胜感激。


这是一种简化的方法(它不需要 PInvoking、鼠标跟踪/挂钩或其他低级运营)。
如果您不需要对窗口后面发生的事情进行太多控制,您不想记录动画图像,只需执行问题描述中的操作:捕获当前在鼠标指针。

这里使用了一个技巧:Form的BackColor和它的TransparencyKey被设置为蓝色(Color.Navy)。这允许有一个透明但solid Form.
在实践中,MouseMove即使表单完全透明,也会引发事件点击通过.

另一个准技巧是使用标准双缓冲表单双缓冲财产,而不是OptimizedDoubleBuffer可以调用以下命令来启用SetStyle() method.

The 调整大小重画属性设置为 true,因此如果/当调整大小时,表单会重新绘制自身。

通过此设置,要获取光标位置下的颜色,您只需使用大小为的位图拍摄当前屏幕的单像素快照(1, 1)(我们只需要那个像素)并使用(不是很快但功能齐全)GetPixel()方法从位图中读取颜色。

单击鼠标右键时,光标下的颜色将保存在List<Color>(可以使用公共/只读访问SavedColors属性),然后在用作画布的 PictureBox 中绘制Palette.

要构建此示例:

  • 创建一个新表格
  • 添加一个PictureBox(此处命名为picColor)并将其锚定在右上角。该控件用于当鼠标指针移动时显示光标下的当前颜色。
  • 添加第二个 PictureBox(此处名为picPalette) 在前一个下方并将其锚定为“上-右-下”。这用于绘制已保存颜色的当前调色板。
    在设计器中,使用事件面板通过您可以在此代码中找到的处理程序方法订阅 Paint 事件(即,不要添加另一个)。

using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public partial class frmColorPicker : Form
{
    Color m_CurrentColor = Color.Empty;
    List<Color> m_SavedColors = new List<Color>();

    public frmColorPicker()
    {
        InitializeComponent();
        ResizeRedraw = true;
        DoubleBuffered = true;

        TopMost = true;
        BackColor = Color.Navy;
        TransparencyKey = Color.Navy;
    }

    public Color CursorEllipseColor { get; set; } = Color.Orange;

    public List<Color> SavedColors => m_SavedColors;

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        GetColorUnderCursor();
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        var rect = GetCursorEllipse();
        using (var pen = new Pen(CursorEllipseColor, 2)) {
            e.Graphics.DrawEllipse(pen, rect);
        }
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        if (e.Button == MouseButtons.Right) {
            m_SavedColors.Add(m_CurrentColor);
            picPalette.Invalidate();
        }
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        Invalidate();
    }

    private Rectangle GetCursorEllipse()
    {
        var cursorEllipse = new Rectangle(PointToClient(Cursor.Position), Cursor.Size);
        cursorEllipse.Offset(-cursorEllipse.Width / 2, -cursorEllipse.Height / 2);
        return cursorEllipse;
    }

    private void GetColorUnderCursor()
    {
        using (var bmp = new Bitmap(1, 1))
        using (var g = Graphics.FromImage(bmp)) {
            g.CopyFromScreen(Cursor.Position, Point.Empty, new Size(1, 1));
            m_CurrentColor = bmp.GetPixel(0, 0);
            picColor.BackColor = m_CurrentColor;
        }
    }

    private void picPalette_Paint(object sender, PaintEventArgs e)
    {
        int rectsCount = 0;
        int rectsLines = 0;
        int rectsPerLine = picPalette.Width / 20;

        foreach (var color in m_SavedColors) {
            using (var brush = new SolidBrush(color)) {
                var rect = new Rectangle(new Point(rectsCount * 20, rectsLines * 20), new Size(20, 20));
                e.Graphics.FillRectangle(brush, rect);
                e.Graphics.DrawRectangle(Pens.DarkGray, rect);
                rectsCount += 1;
                if (rectsCount == rectsPerLine) {
                    rectsCount = 0;
                    rectsLines += 1;
                }
            }
        }
    }
}

它是这样工作的:

Transparent Form GetPixel

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

如何使用半透明选择器选择屏幕上任意位置的颜色? 的相关文章

  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • MS Office PIA“向后兼容性”

    我已经成功完成了与 MS Word 集成的 Windows 窗体应用程序 该应用程序写入 Word 模板中的合并字段 我使用 MS Word 2007 制作了该模板 但以兼容模式将其保存为 97 2003 dot 文件 由于我安装了 Off
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • 重复 iPhone 中滚动期间 tableview 单元格的问题

    有 5 个单元格 每个单元格有一个动态标签 单元格的高度是使用 heightForRowAtIndexPath 方法根据标签内容定义的 现在 显示 3 个单元格 当我滚动下一个单元格时 将调用一次 cellForRowAtIndexPath
  • 64 位 JVM 的最大可能堆大小是多少?

    理论上可以设置的最大堆值 Xmx在32位系统中当然是2 32字节 但通常 参见 了解最大 JVM 堆大小 32 位与 64 位 一个人不能使用全部4GB 对于64位机器上运行在64位操作系统中的64位JVM来说 除了理论限制之外还有什么限制
  • 何时复制 C# 值/对象以及何时复制其引用?

    在复制我想要引用的对象或引用我想要复制的对象的地方 我不断遇到相同的问题 当我使用 运算符时会发生这种情况 例如 如果我将对象发送到另一种形式 即 SomeForm myForm new SomeForm SomeObject myObje
  • 如何验证域凭据?

    我想针对域控制器验证一组凭据 例如 Username STACKOVERFLOW joel Password splotchy 方法 1 通过模拟查询 Active Directory 很多人建议在 Active Directory 中查询
  • 如何使用 wget 模块从 URL 列表下载 PDF?

    我有一个 Python 脚本 它可以从website与 Selenium 并将它们存储在列表中 现在 我想用以下命令下载它们wget module 这是代码的相关部分 其中脚本完成了从网站获取的部分 URL new links for li
  • 在 Objective c 中在 iPhone 上绘图 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我对编程很陌生 我已经制作了一半的 简单 应用程序 但我想知道如何在屏幕上绘制图片 用户
  • 更改C中二维动态数组的大小

    我创建一个二维动态数组 a int calloc n 1 sizeof int for i 0 i lt n 1 i a i int calloc n sizeof int 然后我需要更改其大小 添加新行 a int realloc a n
  • 如何在 GAE 任务队列中执行需要 OAuth 的操作?

    我有一个简单的 Google App Engine 应用程序 其中包括 update更新 YouTube 播放列表的页面 它看起来像这样 class UpdatePage webapp2 RequestHandler decorator o
  • 如何四舍五入到指定数字的最接近倍数?

    我看过很多关于四舍五入到最接近的数字倍数的问题 但我无法很好地理解他们的方法 无法采用它们四舍五入到 45 或者他们使用其他语言的特定于语言的方法 如果上面的内容还没有多大意义 这里有一个更详细的解释 输入示例 int num1 67 in
  • Spark CSV - 找不到实际参数的适用构造函数/方法

    我在 java Spark 应用程序中的类型数据集的过滤器和映射上使用 lambda 函数时遇到问题 我收到此运行时错误 ERROR CodeGenerator failed to compile org codehaus commons
  • Google Guice 桌面应用程序 - 如何使其工作?

    我在我的网络应用程序中使用 Guice 没有出现任何问题 并且我想在桌面应用程序中使用它 我当然错过了一件事 某种方式告诉我的应用程序如何绑定所有内容并知道什么是什么 在网络应用程序中 我在应用程序类中对此进行了声明 我应该如何在桌面应用程
  • Firebase JWT 身份验证,持续发送令牌?

    您好 我是 Firebase 新手 但非常喜欢它 我读到了这个 https www firebase com docs security custom login html我能够成功创建 JWT 并针对我的 Firebase 帐户进行身份验
  • XAML 中 BackKeyPress 的挂钩命令

    有没有办法将 BackKeyPressed 事件连接到视图 XAML 中的命令 我正在使用 MVVM Light 我有一些可以显示的登录 注册屏幕 如果他们处于登录 注册过程中 这只是显示 隐藏用户控件 我希望能够拦截后退按钮 以便我可以显
  • 离子科尔多瓦相机不工作

    我正在使用以下内容Git 请参阅此处的代码 作为 Phonegap Build 的输入 并已在我的手机上正确安装该应用程序 iOS 该应用程序正确打开 但当我尝试拍照 单击按钮 时没有任何反应 它应该显示相机拍摄的图像 有人可以向我解释什么
  • 如何使用java从同一tomcat中的不同项目获取tomcat项目路径

    我正在使用此代码读取 tomcat 项目 称为 Project1 中的文件 现在我想使用 java util concurrent Tomcat 项目 称为 Project2 在不同的 tomcat 项目 称为 Project2 中获取此路
  • 图像预加载器如何工作?

    我很难理解图像预加载器的工作原理在java脚本中 因此 如果有人能用一个例子来解释他们如何工作 那将会有很大帮助 没有jquery 加载单个图像 浏览器将异步加载图像 这意味着当浏览器被赋予 src图像的 它将开始在后台加载该图像 但也会在
  • Java网络服务器和TIME_WAIT

    我在接收来自我公司生产的设备的信号的网络服务器方面遇到了问题 设备偶尔会重用刚刚使用过的源端口 这会导致 SYN 被服务器丢弃 然后设备会重试 直到旧套接字超出服务器上的 TIME WAIT 状态 然后服务器发送 SYN ACK 服务器是用
  • 如何在 howler.js 上链接声音

    我需要在 howler js 中播放一些声音 但我不知道如何链接它 例如 在字符串 BCG 需要先玩 b ogg 然后玩 c ogg 最后玩 g ogg 如果我只是使用 加载后 sound play b sound play c sound
  • 单击 Javascript 中的按钮显示 android DatePicker

    这是我的要求 我正在将一个 html 文件加载到 WebView 上 我在 html 文件中有一个按钮来选择日期 当我单击该按钮时 我想打开 Android 日期选择器对话框 选择日期后 我想在 html 文件中显示所选日期 谁能指导我 请
  • 如何使用半透明选择器选择屏幕上任意位置的颜色?

    小免责声明 这是我第一次在表单中搞乱图形 因此我对这里的概念不太熟悉 好吧 所以我一直在尝试制作一个应用程序来跟踪光标在整个屏幕中的位置并在其周围绘制一个椭圆 我借用的代码来自this问题 我更改了椭圆的 X 和 Y 位置 以便在光标周围自