用户在前端框选头像区域,预览画布是 200×200,实际提交的是按 0.5 缩放后的坐标。后端按原图裁出来整体偏右下 40 像素,人脸被切掉一半。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,前端画布做了等比缩放,传给后端的 x/y 还是预览坐标系里的值。后端直接拿去乘原图尺寸,比例因子没有参与换算。宽高也一起偏,越靠边偏得越多。
「裁剪坐标偏移」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
ratio = origin_w / preview_w box = (int(x * ratio), int(y * ratio), int((x + w) * ratio), int((y + h) * ratio)) box = (max(0, box[0]), max(0, box[1]), min(origin_w, box[2]), min(origin_h, box[3])) im.crop(box)
具体做法是,前端提交时把缩放比一起带上 或者直接换算成原图坐标;后端按 ratio 还原 x y width height 再裁;裁剪前对坐标做边界收敛 防止越界报错;裁完把结果尺寸回传前端 和框选区域比对。
最后用这个标准收尾,同一组框选参数裁出来的头像和前端预览重合,偏移从 40 像素降到 2 像素以内,边缘没有越界报错。
