按钮和提示框放大时,整体缩放会让边框与圆角一起变粗。九宫格方法把四角、四边和中心分开,让固定边框与可伸缩内部遵循不同规则。
源图按左、右、上、下固定边宽切成九块。目标尺寸不足以容纳两侧边框时,本例主动把尺寸抬到边框总和;四角大小保持,横边只横向拉伸,竖边只竖向拉伸,中心双向拉伸。
源尺寸[138, 95],边框[左,右,上,下][10, 13, 13, 8] 源横边界[0, 10, 125, 138],源纵边界[0, 13, 87, 95]
请求[19, 18],实际尺寸[23, 21],横边界[0, 10, 10, 23],纵边界[0, 13, 13, 21];按先行后列的九块宽高[[10, 13], [0, 13], [13, 13], [10, 0], [0, 0], [13, 0], [10, 8], [0, 8], [13, 8]],总面积483。
请求[23, 21],实际尺寸[23, 21],横边界[0, 10, 10, 23],纵边界[0, 13, 13, 21];按先行后列的九块宽高[[10, 13], [0, 13], [13, 13], [10, 0], [0, 0], [13, 0], [10, 8], [0, 8], [13, 8]],总面积483。
请求[225, 64],实际尺寸[225, 64],横边界[0, 10, 212, 225],纵边界[0, 13, 56, 64];按先行后列的九块宽高[[10, 13], [202, 13], [13, 13], [10, 43], [202, 43], [13, 43], [10, 8], [202, 8], [13, 8]],总面积14400。
请求[67, 107],实际尺寸[67, 107],横边界[0, 10, 54, 67],纵边界[0, 13, 99, 107];按先行后列的九块宽高[[10, 13], [44, 13], [13, 13], [10, 86], [44, 86], [13, 86], [10, 8], [44, 8], [13, 8]],总面积7169。
请求[234, 146],实际尺寸[234, 146],横边界[0, 10, 221, 234],纵边界[0, 13, 138, 146];按先行后列的九块宽高[[10, 13], [211, 13], [13, 13], [10, 125], [211, 125], [13, 125], [10, 8], [211, 8], [13, 8]],总面积34164。
请求[71, 188],实际尺寸[71, 188],横边界[0, 10, 58, 71],纵边界[0, 13, 180, 188];按先行后列的九块宽高[[10, 13], [48, 13], [13, 13], [10, 167], [48, 167], [13, 167], [10, 8], [48, 8], [13, 8]],总面积13348。
请求[162, 152],实际尺寸[162, 152],横边界[0, 10, 149, 162],纵边界[0, 13, 144, 152];按先行后列的九块宽高[[10, 13], [139, 13], [13, 13], [10, 131], [139, 131], [13, 131], [10, 8], [139, 8], [13, 8]],总面积24624。
前两组专门检查小于或恰好等于最小尺寸时的退化中心,其余组检查正常伸缩。目标范围中不应出现负宽度或负高度。
所有源分块应该刚好覆盖源图;所有目标分块应该刚好覆盖实际目标。中心宽或高为零时允许退化为空区域,不要除以零去计算缩放倍率。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
这种最小尺寸处理是本练习的明确选择,并非所有界面系统都如此。实际实现也可能压缩边框或裁切内容。比较截图前,应先确认采用了哪一种小尺寸规则以及像素对齐方式。