如何在Go语言中实时快速获取屏幕指定位置的像素颜色值?
使用Go语言获取屏幕指定位置像素的颜色值(Hex/RGB格式)
要快速获取屏幕预设位置的单个像素颜色,Go本身没有跨平台的原生API,需要针对不同操作系统调用对应的底层图形接口。以下是各平台的具体实现方案:
Windows平台实现
通过调用Windows GDI(图形设备接口)的GetDC和GetPixel函数来获取像素颜色,无需额外依赖。
package main import ( "fmt" "syscall" "unsafe" ) var ( user32 = syscall.NewLazyDLL("user32.dll") getDC = user32.NewProc("GetDC") getPixel = user32.NewProc("GetPixel") releaseDC = user32.NewProc("ReleaseDC") ) // GetScreenPixel 获取指定坐标(x,y)的RGB颜色值 func GetScreenPixel(x, y int) (r, g, b byte, err error) { hDC, _, err := getDC.Call(0) if hDC == 0 { return 0, 0, 0, err } defer releaseDC.Call(0, hDC) colorRef, _, err := getPixel.Call(hDC, uintptr(x), uintptr(y)) if colorRef == 0 { return 0, 0, 0, err } // COLORREF格式为0x00BBGGRR r = byte(colorRef & 0xFF) g = byte((colorRef >> 8) & 0xFF) b = byte((colorRef >> 16) & 0xFF) return r, g, b, nil } // RGBToHex 将RGB转换为十六进制字符串(如#RRGGBB) func RGBToHex(r, g, b byte) string { return fmt.Sprintf("#%02X%02X%02X", r, g, b) } func main() { // 示例:获取屏幕(100,100)位置的像素颜色 r, g, b, err := GetScreenPixel(100, 100) if err != nil { fmt.Printf("获取像素失败: %v\n", err) return } fmt.Printf("RGB值: (%d, %d, %d)\n", r, g, b) fmt.Printf("Hex值: %s\n", RGBToHex(r, g, b)) }
Linux平台实现
依赖X11图形系统,需要先安装系统依赖(如libx11-dev),并使用xgbutil库简化X11调用。
先安装依赖:
sudo apt-get install libx11-dev go get github.com/BurntSushi/xgbutil
实现代码:
package main import ( "fmt" "github.com/BurntSushi/xgbutil" "github.com/BurntSushi/xgbutil/xgraphics" ) // GetScreenPixel 获取指定坐标(x,y)的RGB颜色值 func GetScreenPixel(x, y int) (r, g, b byte, err error) { X, err := xgbutil.NewConn() if err != nil { return 0, 0, 0, err } defer X.Conn().Close() // 获取整个屏幕的截图 img, err := xgraphics.NewDrawable(X, X.RootWin()).Capture() if err != nil { return 0, 0, 0, err } defer img.Destroy() // 检查坐标是否在屏幕范围内 if x < 0 || x >= img.Rect.Dx() || y < 0 || y >= img.Rect.Dy() { return 0, 0, 0, fmt.Errorf("坐标超出屏幕范围") } // 获取像素的RGBA值(A为透明度,这里屏幕截图一般为255) r, g, b, _ = img.At(x, y).RGBA() // RGBA返回的是0-65535范围,转换为0-255 r >>= 8 g >>= 8 b >>= 8 return r, g, b, nil } // RGBToHex 将RGB转换为十六进制字符串 func RGBToHex(r, g, b byte) string { return fmt.Sprintf("#%02X%02X%02X", r, g, b) } func main() { r, g, b, err := GetScreenPixel(100, 100) if err != nil { fmt.Printf("获取像素失败: %v\n", err) return } fmt.Printf("RGB值: (%d, %d, %d)\n", r, g, b) fmt.Printf("Hex值: %s\n", RGBToHex(r, g, b)) }
macOS平台实现
通过cgo调用Cocoa框架的Core Graphics API来获取屏幕像素。
package main /* #cgo LDFLAGS: -framework CoreGraphics -framework Foundation #include <CoreGraphics/CoreGraphics.h> #include <stdlib.h> CGColorSpaceRef getRGBColorSpace() { static CGColorSpaceRef colorSpace = NULL; if (colorSpace == NULL) { colorSpace = CGColorSpaceCreateDeviceRGB(); } return colorSpace; } void getPixelColor(int x, int y, unsigned char *r, unsigned char *g, unsigned char *b) { CGPoint point = CGPointMake(x, y); CGImageRef image = CGDisplayCreateImage(CGMainDisplayID()); if (!image) return; CGContextRef context = CGBitmapContextCreate(NULL, 1, 1, 8, 4, getRGBColorSpace(), kCGImageAlphaPremultipliedLast); if (!context) { CGImageRelease(image); return; } CGContextDrawImage(context, CGRectMake(-point.x, -point.y, CGImageGetWidth(image), CGImageGetHeight(image)), image); unsigned char *data = CGBitmapContextGetData(context); *r = data[0]; *g = data[1]; *b = data[2]; CGContextRelease(context); CGImageRelease(image); } */ import "C" import ( "fmt" "unsafe" ) // GetScreenPixel 获取指定坐标(x,y)的RGB颜色值 func GetScreenPixel(x, y int) (r, g, b byte, err error) { var cr, cg, cb C.uchar C.getPixelColor(C.int(x), C.int(y), &cr, &cg, &cb) return byte(cr), byte(cg), byte(cb), nil } // RGBToHex 将RGB转换为十六进制字符串 func RGBToHex(r, g, b byte) string { return fmt.Sprintf("#%02X%02X%02X", r, g, b) } func main() { r, g, b, err := GetScreenPixel(100, 100) if err != nil { fmt.Printf("获取像素失败: %v\n", err) return } fmt.Printf("RGB值: (%d, %d, %d)\n", r, g, b) fmt.Printf("Hex值: %s\n", RGBToHex(r, g, b)) }
性能优化提示
- Windows平台:可以复用
GetDC获取的设备上下文,避免每次调用都创建和释放,提升获取速度。 - Linux平台:如果需要频繁获取像素,不要每次都重新截图,可定时截取屏幕缓存,或直接操作X11的像素缓冲区。
- macOS平台:同样可以缓存
CGColorSpaceRef和上下文,减少重复创建开销。
内容的提问来源于stack exchange,提问作者Narcotix
相关产品推荐
相关产品推荐

