在 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使用它。
如何不一定每次我打开图像进行检查时都会不一样,或者可能是我只是想知道表单中的颜色。
如果有人能帮我找到合适的,我不想要答案,我将不胜感激。
根据"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
中的位置是在图片上,即它是在图片上还是在边距上。如果它在边距中,则颜色只是BackgroundImage
或BackgroundColor
属性。然后,这可以应用于其他控件以及窗体。
另外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,您可以获得像素的颜色。