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