Design & media

零依赖图片诊断与并排对照(无 Pillow)

Try it

不装 Pillow / OpenCV 也能读图和量图:用标准库 zlib 解码 PNG,做亮度与主色统计、相邻像素跳变(锐度代理)、非白外接框、双线性缩放、裁切、写 PNG、并排/上下对照图、联系表,并用「模拟暗部提亮」把色带暴露出来。当用户说「图片不清晰」「图好糊/发灰/有横条斜条」「颜色不对」「帮我对比这两张图」「从截图里把某块裁出来」「批量看图挑一张」,或需要诊断「生成出来的图为什么在别处变丑」时使用。

What it does

用户贴图说「**不清晰 / 糊 / 发灰 / 有色带**」——先量,别猜。 要验证「我生成的图」和「用户在别处看到的图」到底差在哪。 从一张截图里裁出目标区域做进一步处理。 批量产物要目检(30 张封面/图标/牌面)→ 拼联系表一眼过。 环境装不上 Pillow(本机常驻、CI、客户机)时的唯一出路。

The skill document

零依赖图片诊断与并排对照

何时用

  • 用户贴图说「不清晰 / 糊 / 发灰 / 有色带」——先量,别猜。
  • 要验证「我生成的图」和「用户在别处看到的图」到底差在哪。
  • 从一张截图里裁出目标区域做进一步处理。
  • 批量产物要目检(30 张封面/图标/牌面)→ 拼联系表一眼过。
  • 环境装不上 Pillow(本机常驻、CI、客户机)时的唯一出路。

核心心法:先区分「分辨率问题」还是「渲染问题」

「不清晰」有四种完全不同的原因,对应的解法互不通用:

症状判据解法
真分辨率不够原始像素尺寸 < 显示所需像素提高生成分辨率
被下游二次压缩源图锐、落到目标平台再拉回来就脏改设计(见下)
色带 / 发灰像素挤在近黑区,色阶跨度只有几十级换设计:避开近黑、去平滑渐变
被缩放显示显示宽度 > 可用像素按最终尺寸设计字号

判据来源:把目标平台上实际存的那张图下载回来量。不要只看自己本地生成的文件。

实例(2026-09-21,公众号封面)

本地生成 2250×958 → 平台 CDN /0 也是 2250×958 原图(无损),/640 是 1080×460。 分辨率全程没问题。真正原因:渐变 #0f2b1c → #0d1117 两端亮度都在 0~40, 98% 的像素挤在两个近黑桶里,平均亮度只有 28.5/255(11%)。显示端把暗部提一档 (用户截图实测平均亮度 103.6、暗部抬到 RGB≈(40,56,56))后,量化台阶被放大成 肉眼可见的斜向色带 —— 用户描述就是「糊 + 脏」。

python scripts/inspect.py stats old.png new.png       # 亮度 / 主色 / 跳变
python scripts/inspect.py lift old.png -o old_lift.png
python scripts/inspect.py lift new.png -o new_lift.png
python scripts/inspect.py compare old_lift.png new_lift.png -o cmp.png

量化结果:提亮后背景最强跳变 旧版 83 → 新版 2。

设计侧的三条硬规则(跨项目通用)

  1. 避开近黑区。底色平均亮度别低于 ~40/255。近黑是 8-bit 最脆弱的区间, 任何 gamma / 色彩配置差异都把它掀翻。
  2. 不要平滑渐变。改成「硬停」渐变(色标重叠、无插值)=两块纯色 + 一条硬边:
    background: linear-gradient(100deg, #10362c 0%, #1d5f4a 63%, #1d5f4a 63%, #1d5f4a 100%);
    
    纯色区域在 PNG 里是常量,压缩 / 缩放 / 色彩变换都不会产生色带。
  3. 按最终尺寸设计字号。若下游会把图归一化到 1080 宽,就按 1080 画布定字号, 再 scale:2 截图交给下游降采样 —— 比「大画布设计 + 被缩小」锐。

补充:text-overflow:ellipsis 对 12 字以上的中英混排产品名很容易吃掉内容, 小字号永远比截断好看。而且字号估算公式不可靠(CJK 1.0em / 拉丁 0.56em 对 「混排 + 粗体」会偏窄约 5%),正确做法是在浏览器里实测并自动缩字号:

if (e.scrollWidth > e.clientWidth + 1) e.style.fontSize = (fs * 0.93) + 'px';
// 循环最多 10 轮,直到不溢出

CLI

scripts/inspect.py(scripts/imgtool.py 是被它 import 的库)

python inspect.py stats   <图...>                    # 亮度/主色/跳变 一张表
python inspect.py lift    <图> [--gamma 0.62] -o x   # 模拟暗部提亮,暴露色带
python inspect.py compare <图A> <图B> -o cmp.png     # 上下拼接(白底留边)
python inspect.py bbox    <图> [--thresh 235]        # 非白外接框(从句图截图裁目标)
python inspect.py crop    <图> --box x0,y0,x1,y1 -o x
python inspect.py resize  <图> --width 900 -o x
python inspect.py sheet   <图...> --cols 5 --width 300 -o sheet.png

stats 输出读法:亮度 <40/255 = 整图挤在近黑区(危险的信号); 主色数少 + 跳变低 = 平滑区域已经块状化。

库 API(imgtool.py)

import imgtool as I
w, h, px = I.load_rgb("a.png")              # -> (w, h, RGB 紧凑 bytes)
I.write_png("out.png", w, h, px)            # 写 PNG(zlib 压缩),吃三元组
I.fit_width("a.png", 1000)                  # -> (nw, nh, px, (原w, 原h))
I.resize(w, h, px, nw, nh)                  # -> 裸 bytes(双线性)
I.crop(w, h, px, x, y, cw, ch)              # -> 裸 bytes(裁切)
I.crop_rgb(w, h, px, x, y, cw, ch)          # -> (cw, ch, px),裁切的对称版
I.bbox_nonwhite("a.png", thresh=235)        # -> (x0, y0, x1, y1)
I.vstack([(w,h,px), ...], pad=12)           # -> (tw, th, out) 上下拼接

返回值分两类,混用必炸 ValueError(踩过):

  • 三元组 (w,h,px):load_rgb / fit_width / crop_rgb / vstack —— 可无缝喂给下一环
  • 裸 bytes(只有像素):resize / crop —— 尺寸要自己记,或改用 crop_rgb
  • 所以 cw, ch, p = I.crop(...) 是错的;cw, ch, p = I.crop_rgb(...) 才对。

支持 PNG 色彩类型 0/2/3/4/6、滤镜 0-4、PLTE 调色板。不支持 16bit 与隔行; JPEG 需要先转 PNG(可用浏览器 CDP 截图或系统工具)。

坑

  • 不要只量本地文件。要看下游实际存的那张:CDN 常有多档(/0 原图、/640 降级),编辑器预览加载的往往是降级档,实际显示宽度可能超过它的像素数。
  • 别用「平均亮度」单指标下结论,配合主色分布一起看:平均 28 但主色只有两个 近黑桶,比平均 60 而主色分散更危险。
  • 对称地做对照:把两张图放到同一宽度再拼,否则尺寸差本身就会被误读成清晰度差。
  • vstack 的入参是 (w, h, px) 三元组,不是裸 bytes —— 传错会 ValueError。

Related skills

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván855 installs69 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván559 installs18 stars

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai22 installs8 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

More from oracis

Browse all skills

把本地 Skill 打包并发布到 SkillHub(腾讯 skillhub.cn)与 ClawHub,覆盖预检、发布、状态回读与竞品对标全链路,并在上传被拒时用二分/ddmin 脚本把「服务端 WAF 拦内容(566)」与「包结构/字段问题」精确区分开。当用户说「发布技能到市场」「上架 skill」「SkillHub 提交失败」「Failed to fetch」「566」「上传 zip 报错」「技能审核状态」「版本号被拒」时使用。也讲清「入库成功 ≠ 已公开」——用 `mine` 的 `reviewStatus`、重发探测 `409 VERSION_EXISTS`、`/versions/<v>/signature` 三个探针判断版本到底走到哪一步。

by oracis1 installs1 stars

平台只有网页后台、没有上传 API 时,用本机已装的 Chrome/Edge + CDP 自动化走完上传/发布/填表流程——复用真实登录态、零安装(不下载 500MB Chromium)、能给文件选择框塞文件;并实测富文本编辑器(公众号 / CMS / 邮件模板)里到底哪些 CSS 能活下来,以及在决定是否接入平台自带的「一键排版 / AI 美化」前先抓它输出做结构化 diff。当用户说「只能网页上传」「后台发布」「网页填表自动提交」「发布到技能市场/各平台控制台」「复用已登录的浏览器」「公众号排版样式不生效/保存后样式没了」「一键排版要不要用」「点了按钮没反应/提交没成功也没报错」时使用。

by oracis2 installs

一键安装并实测验证已验证可用的免费 LLM 到 WorkBuddy/Claude Code,无需注册、无需 API Key。当用户说「装免费模型」「加免费模型」「免费 LLM」「免费模型一键装」「验证免费模型可用吗」「免费模型怎么接入」「帮我配几个免费模型」「监控免费模型」「免费模型挂了吗」「kilo 网关」「kilo-auto」「nemotron 免费」「space-bunny」「智谱 glm 免费」「zhipu 免费」「glm-4-flash」「glm-4.7-flash」「glm-z1-flash」「glm-4v-flash」「探测国外免费模型」「国外平台免费 llm」「优先用免费模型」「读图桥接」「vision bridge」「给 glm-4-flash 加读图」「不读图的模型怎么看图」「阶跃星辰」「stepfun」「step 5」「step-5-preview」「限时免费模型」「ccproxy 读图转发」「给 claude code 加读图」时使用。也用于验证已有免费模型配置是否真的可用(tool calling 是否支持、是否限流、是否支持读图),以及定期 watch 监控免费模型是否下线/限流/失去工具调用能力。

by oracis1 installs

在中国大陆网络环境下用 yt-dlp 下载视频(含 Windows GUI 封装)。当用户要下载 YouTube、Bilibili、SoundCloud 等 yt-dlp 支持的站点内容,或遇到「yt-dlp 装不上 / 下载报 502 / Tunnel connection failed / ffmpeg not found / 缺 JS runtime / TLS fingerprint / watch?v=&list= 把整个列表都下了 / Sign in to confirm you're not a bot / The page needs to be reloaded / 下到一半突然下不动 / 下回来的视频糊、有拖影残影 / 下载速度特别慢」等问题时使用。

by oracis2 installs

聚合搜索百度网盘/夸克网盘/阿里云盘等网盘分享链接。当用户想按作者名、课程名、剧名、书名、软件名找网盘下载路径,或提到「网盘搜索」「PanSou」「盘搜」「找到下载链接」「夸克/百度/阿里网盘资源」时使用。包含已验证的 PanSou 协议端点、绕过系统代理的必要写法、以及可直接运行的本地 Web 应用 panradar.py。

by oracis2 installs

在 WorkBuddy(Windows)环境里交付零依赖本地 Web 应用,并绕开官方测试技能完全不覆盖的本机专属坑。当用户要在本机跑起来一个本地 Web 应用 / 单文件工具 / 案例库 / 看板 / 小工具,或要验证刚写完的 HTML/JS/Python 交付物真的能工作时使用。独家覆盖:Bash 缺 coreutils、bash 是 WSL 启动桩、rm 是坏 shim、PowerShell 不回显 stdout、cwd 漂移、预览面板靠 HEAD 探活——这些在干净 Linux 环境里遇不到。

by oracis1 installs