在 C# 中拿起并读取 RGB 嗡嗡鼠标向下事件中的代码

本文关键字:鼠标 代码 事件 RGB 读取 | 更新日期: 2023-09-27 18:19:51

我希望每次单击具有颜色的某个地方(在表单或图片中,具有颜色的des(时,读取并"捕获"/"存储"该位置的RGB值。

作为我第一次尝试做某事,我什至迷失了该使用或不使用的内容,实际上我走在正确的轨道上:

当前状态:

private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        Point p = e.Location;
        label1.Text = Convert.ToString(p);
        label1.Refresh();
        int x, y;
        System.Drawing.Color cor = new Bitmap(" ").GetPixel(x, y);
        MessageBox.Show(Convert.ToString(cor.R) + Convert.ToString(cor.G) + Convert.ToString(cor.B));
    }

在搜索了一些可能需要的东西之后,落入" GetPixel",但不知道它是否真的服务于我想要的,因为在那之前,正如我所说,我第一次尝试相关的东西。

两个问题:

  • 不知道我将如何使用"x"和"y"来获得位置,虽然我只能用"点p = e.Location"得到这两个,但我不能用GetPixel使用它。

  • 如何不一定每次我打开图像进行检查时都会不一样,或者可能是我只是想知道表单中的颜色。

如果有人能帮我找到合适的,我不想要答案,我将不胜感激。

在 C# 中拿起并读取 RGB 嗡嗡鼠标向下事件中的代码

根据"GetPixel"的示例代码,您可以使用

Cursor.Position.X Cursor.Position.Y这里(请参阅下面完整示例的第二行(所以只需使用:

 GetPixel(hdc, p.X, p.Y);

完整示例:

 static private void myControl_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
 {
   IntPtr hdc = GetDC(IntPtr.Zero); 
   uint pixel = GetPixel(hdc, Cursor.Position.X, Cursor.Position.Y);
   ReleaseDC(IntPtr.Zero,hdc);
   Color color = Color.FromArgb((int)pixel);
   Console.WriteLine("Color is {0}",color);
 }

其余函数只是导入 gdi/user32 库

[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc,int nXPos,int nYPos);

应该像魅力一样工作。

进一步解释:

  • GetDC 函数检索指定窗口的工作区或整个屏幕的设备上下文 (DC( 的句柄。还可以在后续 GDI 函数中使用返回的句柄来绘制 DC。

  • 释放 DC 释放手柄。

  • 颜色必须从 Argb 转换为 Rgp

  • 此处的 GetPixel 函数详细信息检索指定坐标处像素的红色、绿色、蓝色值,如下所示

    • 设备上下文的句柄。
    • 要检查的像素的 x 坐标(以逻辑单位表示(。
    • 要检查的像素的 y 坐标(以逻辑单位表示(。

对于这些场景中的每一个,都必须以不同的方式处理相当复杂的情况。对于表单,它是否具有恒定的背景颜色或可变?

但是对于图片框,您需要为其分配picturebox mouse click event,这与表单的操作方式非常相似。现在,一旦完成此操作,您需要确定在图片框中单击的位置。您已经这样做了,即 e.Location .从那里,它只是在该位置获取像素:

Color color = pictureBoxControl.Image.GetPixel(e.Location.X, e.Location.Y);

请注意,根据您的图像,您可能还必须检查单击的PictureBox中的位置是在图片上,即它是在图片上还是在边距上。如果它在边距中,则颜色只是BackgroundImageBackgroundColor属性。然后,这可以应用于其他控件以及窗体。

另外GetPixel真的很慢,你可能想看看Bitmap.LockBits

首先,您需要创建窗口的屏幕截图:

    private System.Drawing.Bitmap TakeScreenshot()
    {
        int StartX, StartY;
        int Width, Height;
        StartX = 0;
        StartY = 0;
        Width = Convert.ToInt32(this.Width);
        Height = Convert.ToInt32(this.Height);
        System.Drawing.Bitmap Screenshot = new System.Drawing.Bitmap(Width, Height);
        System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(Screenshot);
        G.CopyFromScreen(StartX, StartY, 0, 0, new System.Drawing.Size(Width, Height));
        G.Dispose();
        return Screenshot;
    }

然后你需要你的鼠标位置:

    Point current = e.Location;

你的颜色是:

    Bitmap colorpicker = TakeScreenshot();
    Point current = e.Location;
    hoverColor = colorpicker.GetPixel(current.X,current.Y);
    colorpicker.Dispose();

创建的位图包括窗口的所有像素及其颜色,使用当前鼠标位置,您拥有 x 坐标和 y 坐标,您可以选择要从位图中获取的像素,通过调用方法 GetPixel,您可以获得像素的颜色。