AHK 做自动化时,截图和图片处理非常常见:保存失败现场、裁剪界面区域、给报告图片加水印、把多张截图拼成对比图、批量压缩图片。单个功能看起来不难,但项目里写多了以后,代码很容易散。
ImageOpsAHK 是我基于 ImagePut.ahk 整理的一层业务封装。底层图片读取、保存、截图、剪贴板、窗口图像这些能力仍然交给 ImagePut;ImageOpsAHK 负责把日常自动化里反复用到的流程封成更顺手的函数。
它不是替代 ImagePut
这一点要先说清楚。ImagePut 本身已经很强,ImageOpsAHK 不重复造底层轮子。这个库更像“工作流工具箱”:截图、裁剪、缩放、水印、拼图、差异报告、失败现场包。
所以使用时建议把两个库都放好,并按顺序引入:
#Requires AutoHotkey v1.1
#Include <ImagePut>
#Include <ImageOpsAHK>
ImageOps_CaptureScreen([0, 0, 900, 520], "截图.png")
ImageOps_WatermarkText("截图.png", "ahk66 自动化截图", {"Anchor": "br"}, "水印.png")
常用场景
- 自动化脚本失败时,保存当前页面截图和说明文件。
- 把操作步骤截图裁剪成统一尺寸,放进 Word 或网页报告。
- 给一批截图加水印,方便归档和分享。
- 比较两张截图是否发生变化,做简单 UI 回归检查。
- 批量压缩、转格式、生成缩略图。
几个我觉得实用的函数
输出目录 := A_ScriptDir . "\示例输出"
FileCreateDir, %输出目录%
屏幕截图 := 输出目录 . "\01_屏幕截图.png"
ImageOps_CaptureScreen([0, 0, 900, 520], 屏幕截图)
裁剪缩放图 := 输出目录 . "\02_裁剪并缩放.jpg"
ImageOps_CropResize(屏幕截图, [0, 0, 520, 300], 0.7, 裁剪缩放图, 88)
水印图 := 输出目录 . "\03_添加中文水印.png"
ImageOps_WatermarkText(屏幕截图, "ahk66 自动化截图 " . A_Now, {"Anchor": "br", "FontSize": 26}, 水印图)
拼接图 := 输出目录 . "\04_横向拼接对比.png"
ImageOps_StackHorizontal([裁剪缩放图, 水印图], 12, 16, 拼接图)
失败现场包
我个人比较喜欢这个功能。很多脚本出错时,只弹一个 MsgBox,事后根本不知道当时界面是什么状态。把截图、缩略图、文字信息放到同一个目录,排查问题会轻松很多。
pack := ImageOps_SaveFailurePack("页面截图.png"
, A_ScriptDir . "\失败现场"
, "页面断言失败"
, {"URL": "https://example.com", "原因": "按钮没有出现"})
MsgBox, % pack.folder
适合和不适合
它适合办公自动化、UI 自动化、截图归档、报告插图、批量图片处理。不适合当 OCR、OpenCV、专业修图软件来用。如果目标是识别复杂图像内容,那应该考虑 FindText、WinCapture、OpenCV 或 OCR;如果只是把截图整理得更规范,ImageOpsAHK 就很合适。
示例和打包库【包含1.1.33.10可用的ImagePut库】的下载地址:
demo代码片段展示:
#NoEnv
#SingleInstance Force
SetBatchLines -1
#Include <ImagePut>
#Include <ImageOpsAHK>
输出目录 := A_ScriptDir . "\示例输出"
FileCreateDir, %输出目录%
; 1. 截取当前屏幕左上角区域,保存为 PNG。
屏幕截图 := 输出目录 . "\01_屏幕截图.png"
ImageOps_CaptureScreen([0, 0, 900, 520], 屏幕截图)
; 2. 在截图上裁剪左上角区域,并缩放成更小的预览图。
裁剪缩放图 := 输出目录 . "\02_裁剪并缩放.jpg"
ImageOps_CropResize(屏幕截图, [0, 0, 520, 300], 0.7, 裁剪缩放图, 88)
; 3. 给图片添加中文水印,适合截图归档、报告插图、失败现场标记。
水印图 := 输出目录 . "\03_添加中文水印.png"
ImageOps_WatermarkText(屏幕截图, "ahk66 自动化截图 " . A_Now, {"Anchor": "br", "FontSize": 26}, 水印图)
; 4. 把多张图片横向拼接,适合做前后对比图、步骤说明图。
拼接图 := 输出目录 . "\04_横向拼接对比.png"
ImageOps_StackHorizontal([裁剪缩放图, 水印图], 12, 16, 拼接图, 92, 0xFFF5F5F5)
; 5. 旋转、翻转和等比适配,适合统一报告插图尺寸。
旋转图 := 输出目录 . "\05_旋转90度.png"
ImageOps_Rotate(裁剪缩放图, 90, 旋转图)
翻转图 := 输出目录 . "\06_水平翻转.png"
ImageOps_Flip(裁剪缩放图, "horizontal", 翻转图)
报告适配图 := 输出目录 . "\07_等比适配到800x600报告图.jpg"
ImageOps_FitCanvas(屏幕截图, [800, 600], 报告适配图, 88, 0xFFFFFFFF)
预览封面图 := 输出目录 . "\08_裁切填满800x600预览图.jpg"
ImageOps_Fit(屏幕截图, [800, 600], 预览封面图, 88, "", "cover")
; 6. 图片叠加和 Logo 水印:先从截图做一个小 Logo,再半透明贴到右上角。
Logo图 := 输出目录 . "\09_示例Logo小图.png"
ImageOps_CropResize(屏幕截图, [0, 0, 260, 120], [160, 74], Logo图)
Logo水印图 := 输出目录 . "\10_图片叠加Logo水印.png"
ImageOps_WatermarkImage(屏幕截图, Logo图, {"Anchor": "tr", "Padding": 24, "Opacity": 0.55, "Width": 180}, Logo水印图)
指定坐标叠加图 := 输出目录 . "\11_指定坐标叠加图片.png"
ImageOps_Overlay(屏幕截图, Logo图, {"X": 40, "Y": 40, "Opacity": 0.72, "Width": 180}, 指定坐标叠加图)
; 7. 差异报告:输出差异图和差异百分比,适合网页截图回归测试。
差异图 := 输出目录 . "\12_图片差异报告_红色为差异.png"
差异结果 := ImageOps_DiffReport(屏幕截图, 水印图, 差异图)
; 8. 批量处理目录:准备几张输入图,然后批量压缩、转格式、加水印、生成缩略图。
批处理输入目录 := 输出目录 . "\13_批处理输入"
批量压缩目录 := 输出目录 . "\14_批量压缩输出"
批量转格式目录 := 输出目录 . "\15_批量转jpg输出"
批量水印目录 := 输出目录 . "\16_批量加水印输出"
批量缩略图目录 := 输出目录 . "\17_批量缩略图输出"
FileCreateDir, %批处理输入目录%
FileCopy, %屏幕截图%, %批处理输入目录%\屏幕截图.png, 1
FileCopy, %水印图%, %批处理输入目录%\水印图.png, 1
FileCopy, %Logo水印图%, %批处理输入目录%\Logo水印图.png, 1
批量压缩 := ImageOps_BatchCompress(批处理输入目录, 批量压缩目录, 76, {"Recursive": false, "Suffix": "_压缩"})
批量转格式 := ImageOps_BatchConvert(批处理输入目录, 批量转格式目录, "jpg", 86, {"Recursive": false, "Suffix": "_转jpg"})
批量水印 := ImageOps_BatchWatermark(批处理输入目录, 批量水印目录, "ahk66 批量水印", {"Anchor": "br", "FontSize": 22}, {"Recursive": false, "Suffix": "_水印"})
批量缩略图 := ImageOps_BatchThumbnail(批处理输入目录, 批量缩略图目录, [320, 180], {"Recursive": false, "Suffix": "_缩略图", "Extension": "jpg", "BgColor": 0xFFFFFFFF})
; 9. 比较两张图片是否完全一致,适合 UI 自动化验收里的像素级判断。
比较结果 := ImageOps_Compare(屏幕截图, 水印图)
; 10. 打包失败现场:原图、缩略图、文字信息放到同一个目录。
失败包目录 := 输出目录 . "\18_失败现场包"
失败包 := ImageOps_SaveFailurePack(水印图, 失败包目录, "页面断言失败", {"页面": "demo.ahk", "原因": "演示截图打包", "图片相同": 比较结果.equal})
提示 := "ImageOpsAHK 示例生成完成!`n`n"
提示 .= "屏幕截图:" . 屏幕截图 . "`n"
提示 .= "裁剪缩放:" . 裁剪缩放图 . "`n"
提示 .= "中文水印:" . 水印图 . "`n"
提示 .= "横向拼接:" . 拼接图 . "`n"
提示 .= "旋转/翻转/报告适配:" . 旋转图 . " / " . 翻转图 . " / " . 报告适配图 . "`n"
提示 .= "Logo叠加:" . Logo水印图 . "`n"
提示 .= "差异报告:" . 差异图 . ",差异比例 " . 差异结果.diffPercent . "%`n"
提示 .= "批量压缩:" . 批量压缩目录 . "(成功 " . 批量压缩.ok . ")`n"
提示 .= "批量转jpg:" . 批量转格式目录 . "(成功 " . 批量转格式.ok . ")`n"
提示 .= "批量加水印:" . 批量水印目录 . "(成功 " . 批量水印.ok . ")`n"
提示 .= "批量缩略图:" . 批量缩略图目录 . "(成功 " . 批量缩略图.ok . ")`n"
提示 .= "失败现场包:" . 失败包.folder . "`n`n"
提示 .= "图片比较结果:" . (比较结果.equal ? "完全一致" : "不一致") . "(" . 比较结果.reason . ")"
MsgBox, 64, ImageOpsAHK 示例, %提示%
Run, %输出目录%
return
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)