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