把图片透明边缘裁去会改变局部坐标原点。如果仍沿用原来的锚点坐标,图像就可能在屏幕上偏移。正确处理需要同时调整裁剪起点与锚点。
先固定规则与数据
源图中非透明像素坐标已给定,裁剪框取它们的最小包围矩形,右下边界不包含。新锚点等于原锚点减去裁剪左上坐标;绘制时仍让锚点对齐同一个世界位置。
六张独立小图;像素坐标为整数,除列出的像素外均透明。
逐项记录过程
图片1尺寸[8, 18],原锚点[-3, 7],世界锚位[28, 5],非透明像素[(0, 16), (1, 12), (2, 0), (3, 16), (7, 17)]。裁剪框[0, 0, 8, 18],新锚点[-3, 7],新绘制原点[31, -2],像素世界位置[[31, 14], [32, 10], [33, -2], [34, 14], [38, 15]]。
图片2尺寸[20, 14],没有非透明像素,跳过绘制,不创建虚假的一像素裁剪框。
图片3尺寸[11, 15],原锚点[12, 17],世界锚位[33, 89],非透明像素[(2, 5), (4, 11), (4, 12), (4, 13), (9, 0)]。裁剪框[2, 0, 10, 14],新锚点[10, 17],新绘制原点[23, 72],像素世界位置[[23, 77], [25, 83], [25, 84], [25, 85], [30, 72]]。
图片4尺寸[16, 11],原锚点[3, 3],世界锚位[97, 20],非透明像素[(3, 9), (11, 8), (12, 10), (14, 2), (15, 6)]。裁剪框[3, 2, 16, 11],新锚点[0, 1],新绘制原点[97, 19],像素世界位置[[97, 26], [105, 25], [106, 27], [108, 19], [109, 23]]。
图片5尺寸[13, 8],原锚点[-3, 7],世界锚位[-13, 45],非透明像素[(0, 0), (3, 1), (7, 3), (11, 2), (12, 7)]。裁剪框[0, 0, 13, 8],新锚点[-3, 7],新绘制原点[-10, 38],像素世界位置[[-10, 38], [-7, 39], [-3, 41], [1, 40], [2, 45]]。
图片6尺寸[15, 18],原锚点[-2, 1],世界锚位[60, 71],非透明像素[(1, 10), (9, 6), (9, 12), (11, 7), (12, 5), (14, 10), (14, 15)]。裁剪框[1, 5, 15, 16],新锚点[-3, -4],新绘制原点[63, 75],像素世界位置[[63, 80], [71, 76], [71, 82], [73, 77], [74, 75], [76, 80], [76, 85]]。
裁掉左侧和上侧空白时,新锚点可能变成负数,这仍可正确表示图像与世界锚位的关系。检查最终像素位置比只看锚点是否落在图片里更可靠。
独立复核的方法
逐个检查原图像素与裁剪后像素的世界坐标相同。锚点可以在裁剪框外,不应为了让数值看起来漂亮就强行限制进框内。若没有任何非透明像素,本例跳过绘制。
建议先按原始数据自己算一遍,保留中间状态后再与本例对照。发生分歧时,先寻找最早不同的步骤,检查边界是否包含、编号与坐标方向是否一致,以及状态是在事件之前还是之后更新。最终结果相同并不能替代对过程规则的理解,修改输入后也需要重新核算。
使用范围
这里不考虑旋转、缩放和纹理过滤,只追踪平移与像素坐标。真实素材还可能保留碰撞框、九宫格边距或其他元数据,裁剪这些素材时需要分别维护它们的坐标关系。
