惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 热门话题
S
Secure Thoughts
TaoSecurity Blog
TaoSecurity Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
AI
AI
B
Blog RSS Feed
S
Schneier on Security
雷峰网
雷峰网
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
罗磊的独立博客
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
The Cloudflare Blog
Webroot Blog
Webroot Blog
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 叶小钗
美团技术团队
L
Lohrmann on Cybersecurity
T
The Blog of Author Tim Ferriss
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
Know Your Adversary
Know Your Adversary
O
OpenAI News
博客园 - 【当耐特】
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cybersecurity and Infrastructure Security Agency CISA
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
PCI Perspectives
PCI Perspectives
H
Heimdal Security Blog
I
InfoQ
GbyAI
GbyAI
T
Threatpost
C
Cisco Blogs

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第07章 - 屏幕截图与图像处理
我才是银古 · 2026-06-24 · via 博客园 - 我才是银古

第07章 - 屏幕截图与图像处理

截图是图像识别、自动化测试、AI 计算机使用等高级场景的基础。RobotGo 提供了从“一行代码保存截图”到“底层位图操作”的多层次截图 API,并配套了丰富的类型转换函数,方便与 Go 标准库 image 包以及第三方图像库互通。本章系统讲解截图、保存、图像转换的完整流程。

7.1 截图相关的核心类型

在深入函数之前,先认识 RobotGo 中几个关键的图像类型,理解它们之间的转换关系是用好截图功能的前提:

  • robotgo.Bitmap:RobotGo 自定义的位图结构(Go 侧)。
  • robotgo.CBitmap:底层 C 位图的句柄(指向 C 的 MMBitmapRef),由 CaptureScreen 返回。
  • image.Image / *image.RGBA:Go 标准库的图像类型,便于与生态中其他库协作。
  • []byte / string:编码后的图像字节流,便于网络传输或存储。

这些类型之间可以通过一组转换函数互相转化,下文 7.6 节会给出完整对照表。

7.2 一行代码截图:SaveCapture

最简单的截图方式是 SaveCapture,它截图并直接保存为文件:

// 截取整个屏幕
robotgo.SaveCapture("full.png")

// 截取指定区域:起点 (x, y),宽 w,高 h
robotgo.SaveCapture("region.png", 10, 10, 300, 200)

对于只需要“拍个图存下来”的场景,SaveCapture 已经足够。

7.3 截图为位图:CaptureScreen

CaptureScreen 返回底层的 C 位图(CBitmap),适合需要进一步处理(如位图查找)的场景。特别重要:C 位图占用的是 C 侧内存,使用完毕后必须手动释放,否则会内存泄漏:

// 截取从 (10, 10) 开始、30x30 的区域
bit := robotgo.CaptureScreen(10, 10, 30, 30)
defer robotgo.FreeBitmap(bit) // 必须释放!

fmt.Println("位图:", bit)

// 转换为 Go 的 image.Image
img := robotgo.ToImage(bit)

不带参数的 robotgo.CaptureScreen() 会截取整个屏幕。养成 bit := robotgo.CaptureScreen(...) 后立刻 defer robotgo.FreeBitmap(bit) 的习惯,可以有效避免内存泄漏。

如需一次释放多个位图,可用 FreeBitmapArr

bit0 := robotgo.CaptureScreen()
bit1 := robotgo.CaptureScreen(10, 10, 30, 30)
defer robotgo.FreeBitmapArr(bit0, bit1)

7.4 截图为 image.Image:CaptureImg

如果你更习惯直接使用 Go 标准库的 image.ImageCaptureImg 是更省心的选择——它返回的是 Go 侧的图像,无需手动释放 C 内存

// 截取整个屏幕
img, err := robotgo.CaptureImg()
if err != nil {
    fmt.Println("截图失败:", err)
    return
}

// 截取指定区域
img2, _ := robotgo.CaptureImg(10, 10, 200, 200)

CaptureImg 在多数图像处理场景下比 CaptureScreen 更方便,推荐优先使用,除非你确实需要 C 位图(例如直接做位图查找)。

7.5 保存图像

RobotGo 提供了多种保存函数:

img, _ := robotgo.CaptureImg()

// 保存为 PNG
robotgo.Save(img, "screen.png")

// 保存为 JPEG,第三个参数是质量(0-100)
robotgo.SaveJpeg(img, "screen.jpeg", 50)

结合 imgo 库也可以保存:

import "github.com/vcaesar/imgo"

img := robotgo.ToImage(bit)
imgo.Save("test.png", img)

7.6 图像类型转换大全

RobotGo 提供了一整套类型转换函数,覆盖了上面提到的各种类型之间的互转。下表整理自官方文档(带 * 的为需要注意内存释放的 C 相关转换):

转换方向 函数
Bitmap → CBitmap ToCBitmap()
Bitmap → *image.RGBA ToRGBAGo()
CBitmap → C.MMBitmapRef ToMMBitmapRef()
CBitmap → Bitmap ToBitmap()
CBitmap → image.Image ToImage()
CBitmap → *image.RGBA ToRGBA()
C.MMBitmapRef → CBitmap CBitmap()
image.Image → Bitmap ImgToBitmap()
image.Image → CBitmap ImgToCBitmap()
image.Image → []byte ToByteImg()
image.Image → string ToStringImg()
*image.RGBA → Bitmap RGBAToBitmap()
[]byte → image.Image ByteToImg()
[]byte → CBitmap ByteToCBitmap()
string → image.Image StrToImg()

借助这张表,你几乎可以在任意两种图像表示之间自由转换。例如把截图编码为 []byte 通过网络发送,对端再用 ByteToImg 还原。

7.7 从文件解码图像

DecodeImg 可以把磁盘上的图片文件读入为 image.Image

img, _, err := robotgo.DecodeImg("test.png")
if err != nil {
    fmt.Println("解码失败:", err)
    return
}

这在图像查找(把预先保存的“模板图”读入再到屏幕上匹配)时非常常用。

7.8 完整示例:多屏截图

下面是官方屏幕示例的整理版,演示截图、转换、保存以及多屏遍历:

package main

import (
    "fmt"
    "strconv"

    "github.com/go-vgo/robotgo"
    "github.com/vcaesar/imgo"
)

func main() {
    x, y := robotgo.Location()
    fmt.Println("鼠标位置:", x, y)

    color := robotgo.GetPixelColor(100, 200)
    fmt.Println("颜色:", color)

    sx, sy := robotgo.GetScreenSize()
    fmt.Println("屏幕尺寸:", sx, sy)

    // CaptureScreen 返回 C 位图,必须释放
    bit := robotgo.CaptureScreen(10, 10, 30, 30)
    defer robotgo.FreeBitmap(bit)

    img := robotgo.ToImage(bit)
    imgo.Save("test.png", img)

    // 遍历每块显示器分别截图
    num := robotgo.DisplaysNum()
    for i := 0; i < num; i++ {
        robotgo.DisplayID = i

        img1, _ := robotgo.CaptureImg()
        path1 := "save_" + strconv.Itoa(i)
        robotgo.Save(img1, path1+".png")
        robotgo.SaveJpeg(img1, path1+".jpeg", 50)

        img2, _ := robotgo.CaptureImg(10, 10, 20, 20)
        robotgo.Save(img2, "test_"+strconv.Itoa(i)+".png")

        dx, dy, w, h := robotgo.GetDisplayBounds(i)
        img3, err := robotgo.CaptureImg(dx, dy, w, h)
        fmt.Println("截图错误:", err)
        robotgo.Save(img3, path1+"_1.png")
    }
}

7.9 实战技巧与注意事项

  1. 优先 CaptureImg:除非要做位图查找需要 CBitmap,否则用 CaptureImgimage.Image 更省心,避免手动管理 C 内存。
  2. 务必释放 C 位图:凡是 CaptureScreen / ToCBitmap 等返回 CBitmap 的地方,配对 FreeBitmap / FreeBitmapArr
  3. 截图区域要合理:只截需要的区域可以显著提升性能,尤其是在循环中频繁截图时。
  4. 保存格式选择:PNG 无损、体积大,适合做模板匹配;JPEG 有损、体积小,适合传输和归档。做图像识别时优先 PNG。
  5. 多屏先设 DisplayID:对某块副屏截图前,先设置 robotgo.DisplayID 或用 GetDisplayBounds 计算坐标。
  6. 高分屏注意倍率:Retina 等环境下截图的物理像素可能是逻辑坐标的整数倍,做坐标换算时要考虑缩放。

7.10 小结

本章我们深入学习了 RobotGo 的截图与图像处理能力:用 SaveCapture 一行截图、用 CaptureScreen 获取需要手动释放的 C 位图、用 CaptureImg 获取省心的 image.Image、用 Save / SaveJpeg 保存,以及一整套图像类型转换函数和从文件解码图像的方法。我们特别强调了 C 位图的内存释放问题。下一章将基于截图能力,讲解“位图查找”——在屏幕上自动定位某张小图的位置。