做本地图像批处理比如给一批工程截图批量去水印、加水印、转格式时OpenCV 多半是大家顺手就用的库。但真上手写你会发现坑不在算法在 IO 和颜色。我把踩过的 3 个坑记下来省得你再查两小时。坑一中文路径imread 直接返回 None这是新手最容易踩的一个。代码看起来没问题importcv2 imgcv2.imread(工地现场/客厅.jpg)# 返回 Noneprint(img)# None原因cv2.imread 底层走的是 C 的 fopen中文路径在 Windows 下编码对不上直接读不到还不报错只给你一个 None。解法别让 imread 读路径先把文件读成字节再解码importnumpyasnpimportcv2defimread_u(path):# 用 numpy 按字节读文件绕开中文路径datanp.fromfile(path,dtypenp.uint8)returncv2.imdecode(data,cv2.IMREAD_COLOR)imgimread_u(工地现场/客厅.jpg)print(img.shape)# (h, w, 3)保存同理cv2.imwrite 也吃中文路径用 imencode tofiledefimwrite_u(path,img):ok,bufcv2.imencode(.jpg,img)ifok:buf.tofile(path)坑二颜色发蓝——BGR 和 RGB 搞反了OpenCV 读进来是 BGR 顺序而 matplotlib、PIL、网页前端都是 RGB。你用 matplotlib 直接 imshow 一张 cv2 读的图天空会变蓝、人脸会发青。importmatplotlib.pyplotasplt imgimread_u(客厅.jpg)plt.imshow(img)# 颜色怪异plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))# 正常经验法则OpenCV 内部处理保持 BGR凡是要和 matplotlib / PIL / HTML canvas 打交道先 cvtColor 转成 RGB显示或保存前再转回 BGR。坑三批处理卡内存——一次别把整文件夹读进内存给几千张图批量加水印新手容易写成先全读进来再循环处理内存直接爆。正确做法是流式读一张、处理一张、写一张、释放。frompathlibimportPathimportcv2,numpyasnpdefadd_wm(src,dst,textSAMPLE):imgimread_u(src)ifimgisNone:returnFalsecv2.putText(img,text,(20,40),cv2.FONT_HERSHEY_SIMPLEX,1.0,(255,0,0),2)imwrite_u(dst,img)returnTrueforpinPath(in).glob(*.jpg):add_wm(str(p),fout/{p.name})小图用 IMREAD_COLOR 足够超大图按需用 IMREAD_REDUCED 降采样能省不少内存。小结本地图像批处理的三个坑中文路径用 np.fromfile imdecode、颜色用 cvtColor 在 BGR/RGB 间切换、批处理用流式读写别贪内存。把这三处固定成工具函数后面做去水印、拼九宫格、转格式都能直接复用。我们把这套本地批处理逻辑封装成了一个零依赖的桌面去水印小工具思路就是上面这几点。相关实现和更多工程图像处理的踩坑整理在 maixuzi.cn/resources/ 当前免费开放感兴趣可以点开看看。