#!/usr/bin/env python3 """读取截屏像素,定位颜色分界点。 用途:判断某块区域(顶部留白、底部白带、状态栏……)到底是什么颜色、有多高。 不要靠眼睛估计截图,直接读像素。 用法: sips -s format bmp /tmp/shot.jpg --out /tmp/shot.bmp python3 docs/tools/px.py /tmp/shot.bmp [x] x 默认 10 —— 最左边一列通常只经过背景、不经过文字,跳变点最干净。 点(pt)= 像素 / 3,iPhone 16 Pro 是 3x;数值请以实际机型的 scale 为准。 为什么不用 swift:本机 `swift foo.swift` 会报 could not build module '_DarwinFoundation1',所以走 sips + 纯标准库这条路。 sips 输出的是 24bpp、自下而上(height 为负)的 BMP,下面按这个解析。 """ import struct import sys path = sys.argv[1] x = int(sys.argv[2]) if len(sys.argv) > 2 else 10 data = open(path, 'rb').read() if data[:2] != b'BM': sys.exit('not a BMP — 先用 sips 转一下') datastart = struct.unpack_from(' 0 H = abs(height) row_size = ((bpp * width + 31) // 32) * 4 Bpp = bpp // 8 def px(x, y): """y 用图像坐标,0 = 最上面一行""" ry = (H - 1 - y) if bottom_up else y off = datastart + ry * row_size + x * Bpp b, g, r = data[off], data[off + 1], data[off + 2] return '#%02X%02X%02X' % (r, g, b) print('\n--- scan x=%d (背景列,打印所有颜色跳变) ---' % x) last = None for y in range(H): k = px(x, y) if k != last: print('y=%4d %7.1fpt %s' % (y, y / 3.0, k)) last = k