ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CLI-Anything 的 GIMP CLI 实战指南:基于 Pillow 与 Script-Fu 双引擎的状态化命令行图像编辑

CLI-Anything 的 GIMP CLI 实战指南:基于 Pillow 与 Script-Fu 双引擎的状态化命令行图像编辑 CLI-Anything 的 GIMP CLI 实战指南基于 Pillow 与 Script-Fu 双引擎的状态化命令行图像编辑【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything导读GIMP CLI 是 CLI-Anything 生态中为 GIMP 图像处理打造的 Agent 原生命令行接口。它以 JSON 项目清单manifest维护图层、滤镜与撤销历史用 Pillow 作为默认图像引擎并在系统装有 GIMP 时自动切换到gimp -i -b批处理模式获取原生画质渲染。阅读本文你将掌握无 GUI 环境下如何新建项目、搭建图层、叠加滤镜与文字、按预设导出图片理解其双引擎渲染与撤销/重做undo/redo机制并可直接把整套命令交给 AI Agent 在一次性调用与交互式 REPL 两种模式下完成图片编辑任务。GIMP CLI 的定位与设计思想GIMP CLI见 模块 README被定位为stateful command-line interface for image editing, built on Pillow面向 AI Agent 与高级用户其核心价值是让 图片编辑 这件事不再依赖 GIMP 的 GTK 图形界面从而可以被命令行、脚本和 LLM Agent 可靠地编排。与直接解析 GIMP 原生 XCF 二进制格式不同GIMP 的 xcf-load.c 本身就有数千行 C 代码复杂度极高该模块采用如下策略详见 GIMP.md 的项目格式一节JSON 项目文件作为事实来源用.gimp-cli.json这类清单记录画布尺寸、图层栈、滤镜链、绘制操作draw ops与历史Pillow 作为主要引擎负责图像 I/O、像素处理、基础滤镜、颜色调整、绘制与合成GIMP 批处理模式作为增强引擎若系统安装了gimp则通过 Script-Fugimp -i -b执行真正的 GIMP 原生滤镜与导出。这种 JSON 状态 可插拔渲染后端 的设计正是其相比一次性 shell 脚本更适合 Agent 的关键每一步操作都落盘为可续接的项目状态Agent 可以跨多次调用编辑同一张图。环境依赖与安装方式源码模块位于 gimp/agent-harness/cli_anything/gimp其包名为cli-anything-gimp可通过目录下的 setup.py 安装pip install -e .或从仓库发布到 PyPI 后pip install cli-anything-gimp安装后会生成cli-anything-gimp控制台命令。运行时依赖依赖用途备注Python 3.10解释器setup.py 中python_requires3.10clickCLI 框架install_requires中click8.0.0Pillow图像处理见 setup.py 的extras_require[pillow]numpy混合模式与像素分析README 标注为必需项prompt_toolkit交互式 REPL 皮肤可选仅 REPL 需要gimp系统包原生批处理渲染可选但推荐缺失时自动回退 Pillow直接按 README 安装全部 Python 依赖pip install Pillow click numpy prompt_toolkit若希望渲染时使用 GIMP 原生引擎推荐具体见后文 双引擎渲染在 Debian/Ubuntu 上安装系统包apt install gimp需要说明适用前提不装 GIMP 时分层合成、绝大多数滤镜与全部导出格式仍可通过 Pillow 路径完成GIMP 只是被优先尝试的增强后端。运行方式一次性命令与交互式 REPL所有命令都在gimp/agent-harness/目录下运行。命令入口有两种等价形式安装后cli-anything-gimp 命令...源码运行python3 -m cli_anything.gimp.gimp_cli 命令...包结构见 gimp/agent-harness/cli_anything以下是文档给出的完整入门命令序列# 查看帮助 python3 -m cli_anything.gimp.gimp_cli --help # 新建项目全高清画布 python3 -m cli_anything.gimp.gimp_cli project new --width 1920 --height 1080 -o my_project.json # 使用画布预设新建项目 python3 -m cli_anything.gimp.gimp_cli project new --profile hd720p -o project.json # 打开既有项目并展示信息 python3 -m cli_anything.gimp.gimp_cli --project project.json project info # JSON 输出供 Agent 机器消费 python3 -m cli_anything.gimp.gimp_cli --json --project project.json project info注意各命令的前置用法不带--project的一次性命令会操作 当前会话 中的项目需要先project new或project open带上--project path会在每次调用前自动加载对应项目文件执行后再自动保存见 gimp_cli.py 的自动保存回调--json放在子命令之前使输出变为结构化 JSON另有全局--dry-run选项可在不写盘的前提下演练命令自动保存会被跳过。交互式 REPLpython3 -m cli_anything.gimp.gimp_cli repl python3 -m cli_anything.gimp.gimp_cli repl --project my_project.json不带子命令直接执行也会进入 REPL。REPL 内部输入help可查看全部可用命令支持quit/exit/q退出并对异常做容错展示而不会退出会话见 gimp_cli.py 的 repl 命令。REPL 的彩色提示皮肤与历史输入由 utils/repl_skin.py 基于prompt_toolkit提供。命令全集参考按命令组展开CLI 共划分为 8 个命令组project、layer、canvas、filter、media、export、draw、session。以下继承 README 的 Command Reference 并逐组结合源码补全参数语义。Project项目生命周期project new [--width W] [--height H] [--mode RGB|RGBA|L|LA] [-o path] project open path project save [path] project info project profiles project jsonproject new的完整参数来自 gimp_cli.py 的 project_new默认可参见 core/project.py 的 create_project--width/--height画布宽高默认 1920×1080--mode颜色模式仅接受RGB、RGBA、L灰度、LA灰度Alpha默认RGB--background/-bg背景色接受十六进制如#ffffff或transparent默认#ffffff--dpi分辨率默认 72--name/-n项目名默认untitled--profile/-p画布预设指定后覆盖上面宽高与 dpi--output/-o保存路径同时绑定为会话的项目路径。create_project会做三类校验非法颜色模式、宽高小于 1、DPI 小于 1 都会抛ValueError。生成的项目 JSON 含version、name、canvas{width,height,color_mode,background,dpi}、layers、selection、guides与metadata{created,modified,software}等字段。内置画布预设14 个其精确宽高与 DPI 由 core/project.py 的 PROFILES 常量 定义profile宽×高DPI典型用途hd1080p1920×108072高清视频帧hd720p1280×72072720p 视频帧4k3840×2160724K 画布square10801080×108072方形图片a4_300dpi2480×3508300A4 印刷a4_150dpi1240×1754150A4 快速印刷letter_300dpi2550×3300300美式信纸印刷web_banner1200×62872Web 横幅instagram_post1080×108072信息流帖instagram_story1080×192072竖屏故事twitter_header1500×50072X/Twitter 头图youtube_thumb1280×72072YouTube 缩略图icon_256256×25672小图标icon_512512×51272应用图标project open要求目标 JSON 至少包含version与canvas字段否则判定为非法项目文件open_projectproject save在无参数时保存回会话绑定路径project json打印原始项目 JSON 全文用于 Agent 深度检查。Layer图层管理layer new [--name N] [--type image|text|solid] [--fill F] [--opacity O] [--mode M] layer add-from-file path [--name N] [--position P] [--opacity O] [--mode M] layer list layer remove index layer duplicate index layer move index --to position layer set index property value layer flatten layer merge-down index图层的内部结构与实现见 core/layers.py。每个图层对象包含id、name、type、width/height、visible、opacity、blend_mode、offset_x/offset_y、filters[]image 类型还携带source绝对路径与fill。栈序约定列表下标 0 是最顶层layer list输出自上而下position参数取 0 即压到栈顶add_layer默认插入位置 0layer new支持三种类型image可从文件加载的位图、text携带text/font/font_size/color字段的文本层、solid纯色填充层--fill接受transparent、white、black或十六进制色值image 层若给定了source则忽略 filllayer add-from-file会自动探测源图宽高纯 Python 读文件头无需先装 Pillow见下节并把source记录为绝对路径层名缺省取文件名layer set支持修改属性name、opacity(0.0-1.0)、visible(true/false)、mode混合模式也接受blend_mode、offset_x、offset_y。opacity 越界、模式非法、属性名未知均抛ValueErrorset_layer_propertylayer flatten与layer merge-down在 CLI 中先打标记_flatten_pending/_merge_down_pending真实像素合并发生在导出阶段。文件头探测零依赖读图宽高add-from-file与media probe在缺少 Pillow 时仍可借助纯 Python 的 位读取器 从文件头部解析 PNG、JPEG、GIF、BMP、TIFF、WebP 的宽高JPEG 需扫描 SOF 段、WebP 需解 VP8/VP8L 块、TIFF 需按字节序遍历 IFD 条目。支持的混合模式15 种normal、multiply、screen、overlay、soft_light、hard_light、difference、darken、lighten、color_dodge、color_burn、addition、subtract、grain_merge、grain_extract。非normal模式的像素级合成公式在 Pillow 路径中由 numpy 计算见 export.py 的 _blend_with_mode并在导出时按layer_alpha与base_alpha做标准 alpha 合成。Canvas画布操作canvas info canvas resize --width W --height H [--anchor center|top-left|...] canvas scale --width W --height H [--resample lanczos|bicubic|bilinear|nearest] canvas crop --left L --top T --right R --bottom B canvas mode RGB|RGBA|L|LA|CMYK|P canvas dpi value实现集中在 core/canvas.pycanvas resize不缩放内容只在四周增删空白并用--anchor决定现有内容停靠位置。九种锚点center、top-left、top-right、bottom-left、bottom-right、top、bottom、left、right同时自动平移各层offset以保持相对位置resize_canvascanvas scale会成比例缩放全部图层记录_scale_x/_scale_y/_resample标记导出时按重采样算法重建每个图层scale_canvascanvas crop用(left,top)-(right,bottom)矩形裁切禁止负坐标、要求rightleft且bottomtop裁切区域不能超出画布随后反向平移各层偏移crop_canvascanvas mode除了创建项目时支持的RGB/RGBA/L/LA还额外接受CMYK与P调色板模式canvas dpi要求值为正整数canvas info会额外换算物理尺寸英寸与兆像素数。Filter非破坏性滤镜链filter list-available [--category adjustment|blur|stylize|transform] filter info name filter add name [--layer L] [--param keyvalue ...] filter remove index [--layer L] filter set index param value [--layer L] filter list [--layer L]滤镜注册表见 core/filters.py 的 FILTER_REGISTRY。每个滤镜都带category、description、参数规格type/min/max/default/description与引擎路由信息。CLI 层用--param keyvalue可重复传参先做类型推断含小数点→float否则 int失败保留字符串再经validate_params校验范围并填充默认值。Adjustments 调节类brightness/contrast/saturation/sharpness参数factor1.0 中性范围 0.0–10.0、autocontrastcutoff0–49裁剪极亮极暗百分比、equalize、invert、posterizebits1–8位数越少色阶越少、solarizethreshold0–255、grayscale、sepiastrength0.0–1.0默认 0.8。Blur 模糊/锐化类gaussian_blur、box_blurradius0.1–100、unsharp_maskradius默认 2、percent1–500 默认 150、threshold0–255 默认 3、smooth。Stylize 风格类find_edges、emboss、contour、detail均无参数。Transform 变换类导出期应用rotateangle-360–360expand默认 true、flip_h、flip_v、resizewidth/height1–65535resample默认 lanczos、cropleft/top/right/bottom。每条滤镜以{name, params}追加到图层filters[]中按序执行对同一图层可叠加多条滤镜构成链路且可用filter set事后修正任意参数——整套行为是非破坏性、可重放的。Media媒体探查与健康检查media probe file media list media check media histogram file实现见 core/media.pymedia probe优先用 Pillow 读取宽高、模式、格式、DPI、动图帧数、调色板数、通道/位深与常用 EXIFMake/Model/DateTimeOriginal/ExposureTime/ISO 等Pillow 缺失时自动降级为纯 Python 头部解析宽高/格式media list罗列项目各图层引用的源文件及存在性media check汇总缺失文件返回status: ok或missing_files适合导出前做健康检查media histogram输出每个颜色通道的 min/max/mean帮助判断曝光与色偏要求 Pillow。Export预设导出与渲染export presets export preset-info name export render output [--preset name] [--overwrite] [--quality Q] [--format F]内置 13 个导出预设见 core/export.py 的 EXPORT_PRESETSpreset格式扩展名关键参数pngPNG.pngcompress_level 6png-maxPNG.pngcompress_level 9jpeg-highJPEG.jpgquality 95, subsampling 0jpeg-mediumJPEG.jpgquality 80jpeg-lowJPEG.jpgquality 60webpWEBP.webpquality 85webp-losslessWEBP.webplossless truetiffTIFF.tiffcompression lzwtiff-noneTIFF.tiff无压缩bmpBMP.bmp–gifGIF.gif–pdfPDF.pdf–icoICO.ico–--quality可临时覆盖压缩质量--format F可绕过预设直接指定格式默认--preset png。渲染输出的元数据包含绝对输出路径、格式、画布尺寸、文件大小、实际采用的方法gimp-batch或pillow与渲染的可见层数。注意目标文件已存在时必须加--overwrite否则报FileExistsError。JPEG 导出会自动把 RGBA 合成到白底GIF 导出会转换为 256 色调色板。Draw持久化绘制操作draw text --layer L --text Hello [--x X] [--y Y] [--font F] [--size S] [--color C] draw rect --layer L --x1 X --y1 Y --x2 X --y2 Y [--fill C] [--outline C]draw命令并不立即改像素而是把操作追加进目标图层的draw_ops[]列表{type: text|rect, ...}渲染时统一生效见 gimp_cli.py 的 draw 命令组。这是一个值得注意的取舍若项目存在任何 draw 操作即使装有 GIMP渲染也会自动走 Pillow 路径见 export.py 的 _project_has_draw_ops以保证两类绘制语义一致。字体解析使用逐候选路径的尽力加载DejaVu/Liberation/微软 Arial最终回退默认字体见 export.py 的 _load_font。Session状态查询与撤销session status session undo session redo session history会话由 core/session.py 的 Session 类 管理每个会修改项目的命令执行前都会调用snapshot(描述)把整份项目深拷贝推入撤销栈并记录时间戳撤销栈上限MAX_UNDO 50超出则丢弃最旧状态新快照会清空重做栈undo把当前状态推入重做栈并恢复栈顶快照redo反之session status输出has_project/project_path/modified/undo_count/redo_count/project_name会话保存使用fcntl文件锁 截断重写的原子写_locked_save_json在不可用平台自动降级避免多进程并发写坏项目文件。由于这些快照语义Agent 可通过session undo回退任意误操作再配合--project自动保存形成可靠的编辑循环。JSON 输出模式面向 Agent 消费在子命令前加--json所有输出含错误都会变成json.dumps的结构化文本python3 -m cli_anything.gimp.gimp_cli --json --project p.json layer list全局output()函数会根据开关决定打印人类可读的缩进树还是 JSON异常统一经 handle_error 处理为{error: ..., type: 异常类名}而非裸 traceback——文件缺失、参数非法、文件已存在等场景都有稳定的结构化错误这正是 LLM Agent 解析与自愈所必需的契约。双引擎渲染原理Script-Fu 优先Pillow 兜底导出渲染是整套系统的核心环节。顶层入口 core/export.py 的 render() 按顺序尝试两个后端GIMP Script-Fu 批处理若is_available()在PATH中找到gimp/gimp-2.10/gimp-2.99且项目不含 draw 操作则调用 utils/gimp_backend.py 的 render_project。它动态拼接一段let*形式的 Script-Fu先(gimp-image-new w h RGB)建画布并填充背景再从底到顶(gimp-file-load-layer ...)载入图片层 /(gimp-text-fontname ...)建文本层 /(gimp-layer-new ...)建纯色层逐层设置offset/opacity/mode把每条 CLI 滤镜经 _filter_to_script_fu 映射为 PDB 过程调用如gimp-brightness-contrast、plug-in-gauss、plug-in-unsharp-mask、gimp-item-transform-flip-simple最后gimp-image-flatten后按预设走file-png-save/file-jpeg-save等导出Pillow 兜底GIMP 缺失或任一步骤抛异常时回退到 _render_via_pillow从底到顶遍历可见层_load_layer载入位图/纯色/文本层 →_apply_filters顺序执行滤镜链 →_apply_draw_ops应用绘制操作 → 按_scale标记重采样 → 按 opacity 与混合模式合成。若两个后端都不可用无 Pillow 也无 GIMP会得到一条明确提示安装其一的中文友好错误。两种后端对同一逻辑滤镜采用各自最自然的实现因此同名滤镜在不同引擎下的位级结果可能略有差异如需精确可控且可复现的滤镜结果请固定后端环境。实战工作流一条命令完成照片调色 标题文字 导出将上述能力串成完整可运行的 Agent 工作流继承自 README 的 Example Workflow 并补充可执行细节# 1. 按 hd1080p 预设建项目并落盘 python3 -m cli_anything.gimp.gimp_cli project new --width 1920 --height 1080 --profile hd1080p -o edit.json # 2. 载入照片作为底层背景源图须真实存在否则报 file_not_found python3 -m cli_anything.gimp.gimp_cli --project edit.json layer add-from-file photo.jpg --name Background # 3. 在该层叠加亮度/对比度/饱和度滤镜链 python3 -m cli_anything.gimp.gimp_cli --project edit.json filter add brightness --layer 0 --param factor1.2 python3 -m cli_anything.gimp.gimp_cli --project edit.json filter add contrast --layer 0 --param factor1.1 python3 -m cli_anything.gimp.gimp_cli --project edit.json filter add saturation --layer 0 --param factor1.3 # 4. 新建文本层并写入标题draw op 在渲染期生效 python3 -m cli_anything.gimp.gimp_cli --project edit.json layer new --type text --name Title python3 -m cli_anything.gimp.gimp_cli --project edit.json draw text --layer 0 --text My Photo --size 48 --color #ffffff # 5. 核对图层栈0 为最顶层 python3 -m cli_anything.gimp.gimp_cli --project edit.json layer list # 6. 保存项目并导出 JPEG 高画质成品 python3 -m cli_anything.gimp.gimp_cli --project edit.json project save python3 -m cli_anything.gimp.gimp_cli --project edit.json export render output.jpg --preset jpeg-high --overwrite如果第 2 步的源图与期望不符可用--json ... media probe photo.jpg先探查原图尺寸/EXIF用--json ... media check校验引用文件存在性再进一步可用canvas crop裁掉多余边缘或canvas scale --resample lanczos变更画布后重导出。测试与质量验证该模块自带两层测试位于 gimp/agent-harness/cli_anything/gimp/tests配套说明见 tests/TEST.md# 单元测试仅使用合成数据无需真实图片与外部依赖 python3 -m pytest cli_anything/gimp/tests/test_core.py -v # 端到端测试会真实创建并渲染测试图片 python3 -m pytest cli_anything/gimp/tests/test_full_e2e.py -v # 全部测试 python3 -m pytest cli_anything/gimp/tests/ -v单元测试覆盖项目创建/保存/打开/预设、图层增删改查与非法参数拒绝、滤镜参数校验、画布变换、会话撤销/重做等行为见 test_core.py是理解各命令边界条件越界索引、非法混合模式、负尺寸等的绝佳补充材料。对 Agent 使用而言错误信息与测试断言共同构成了哪些输入会被拒绝的权威清单。小结把 GIMP CLI 接入你的 Agent 流水线GIMP CLI 的价值不在于复刻桌面版 GIMP而在于提供一条可状态续接、可 JSON 化、可撤销重做、可双后端渲染的命令行编辑通道。无论是对接自动化批处理封面生成、缩略图、社交媒体多尺寸导出版还是让 LLM Agent 依据自然语言逐步新建图层→叠滤镜→写字→导出都可以遵循如下契约项目即 JSON可随时project json自省每次变更前自动快照可session undo--json提供机器可读的输入输出面。相关技能描述与包装示例可进一步参考 skills/SKILL.md顶层分析与设计取舍见 GIMP.md。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表