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