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