裁掉透明边缘后怎样让图片原地不动:六张素材的裁剪锚点保持(实例05)

  • 2026-11-07
  • 1

把图片透明边缘裁去会改变局部坐标原点。如果仍沿用原来的锚点坐标,图像就可能在屏幕上偏移。正确处理需要同时调整裁剪起点与锚点。

先固定规则与数据

源图中非透明像素坐标已给定,裁剪框取它们的最小包围矩形,右下边界不包含。新锚点等于原锚点减去裁剪左上坐标;绘制时仍让锚点对齐同一个世界位置。

六张独立小图;像素坐标为整数,除列出的像素外均透明。

逐项记录过程

图片1尺寸[15, 13],原锚点[0, 11],世界锚位[63, 65],非透明像素[(0, 4), (1, 11), (8, 5), (8, 10), (11, 6), (13, 2), (13, 6)]。裁剪框[0, 2, 14, 12],新锚点[0, 9],新绘制原点[63, 56],像素世界位置[[63, 58], [64, 65], [71, 59], [71, 64], [74, 60], [76, 56], [76, 60]]。

图片2尺寸[12, 10],没有非透明像素,跳过绘制,不创建虚假的一像素裁剪框。

图片3尺寸[9, 19],原锚点[6, 5],世界锚位[55, 26],非透明像素[(1, 1), (1, 6), (3, 5), (4, 3), (5, 9)]。裁剪框[1, 1, 6, 10],新锚点[5, 4],新绘制原点[50, 22],像素世界位置[[50, 22], [50, 27], [52, 26], [53, 24], [54, 30]]。

图片4尺寸[13, 8],原锚点[1, 3],世界锚位[45, 96],非透明像素[(2, 2), (5, 2), (11, 0), (12, 3)]。裁剪框[2, 0, 13, 4],新锚点[-1, 3],新绘制原点[46, 93],像素世界位置[[46, 95], [49, 95], [55, 93], [56, 96]]。

图片5尺寸[12, 12],原锚点[7, 14],世界锚位[16, 77],非透明像素[(3, 7), (4, 11), (5, 8), (8, 0), (8, 2), (10, 1), (11, 1)]。裁剪框[3, 0, 12, 12],新锚点[4, 14],新绘制原点[12, 63],像素世界位置[[12, 70], [13, 74], [14, 71], [17, 63], [17, 65], [19, 64], [20, 64]]。

图片6尺寸[19, 20],原锚点[8, 18],世界锚位[-11, 4],非透明像素[(1, 18), (11, 13), (15, 1), (15, 9), (17, 14)]。裁剪框[1, 1, 18, 19],新锚点[7, 17],新绘制原点[-18, -13],像素世界位置[[-18, 4], [-8, -1], [-4, -13], [-4, -5], [-2, 0]]。

裁掉左侧和上侧空白时,新锚点可能变成负数,这仍可正确表示图像与世界锚位的关系。检查最终像素位置比只看锚点是否落在图片里更可靠。

独立复核的方法

逐个检查原图像素与裁剪后像素的世界坐标相同。锚点可以在裁剪框外,不应为了让数值看起来漂亮就强行限制进框内。若没有任何非透明像素,本例跳过绘制。

建议先按原始数据自己算一遍,保留中间状态后再与本例对照。发生分歧时,先寻找最早不同的步骤,检查边界是否包含、编号与坐标方向是否一致,以及状态是在事件之前还是之后更新。最终结果相同并不能替代对过程规则的理解,修改输入后也需要重新核算。

使用范围

这里不考虑旋转、缩放和纹理过滤,只追踪平移与像素坐标。真实素材还可能保留碰撞框、九宫格边距或其他元数据,裁剪这些素材时需要分别维护它们的坐标关系。