You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:33:23