按钮和提示框放大时,整体缩放会让边框与圆角一起变粗。九宫格方法把四角、四边和中心分开,让固定边框与可伸缩内部遵循不同规则。
源图按左、右、上、下固定边宽切成九块。目标尺寸不足以容纳两侧边框时,本例主动把尺寸抬到边框总和;四角大小保持,横边只横向拉伸,竖边只竖向拉伸,中心双向拉伸。
源尺寸[140, 118],边框[左,右,上,下][9, 15, 19, 15] 源横边界[0, 9, 125, 140],源纵边界[0, 19, 103, 118]
请求[20, 31],实际尺寸[24, 34],横边界[0, 9, 9, 24],纵边界[0, 19, 19, 34];按先行后列的九块宽高[[9, 19], [0, 19], [15, 19], [9, 0], [0, 0], [15, 0], [9, 15], [0, 15], [15, 15]],总面积816。
请求[24, 34],实际尺寸[24, 34],横边界[0, 9, 9, 24],纵边界[0, 19, 19, 34];按先行后列的九块宽高[[9, 19], [0, 19], [15, 19], [9, 0], [0, 0], [15, 0], [9, 15], [0, 15], [15, 15]],总面积816。
请求[50, 199],实际尺寸[50, 199],横边界[0, 9, 35, 50],纵边界[0, 19, 184, 199];按先行后列的九块宽高[[9, 19], [26, 19], [15, 19], [9, 165], [26, 165], [15, 165], [9, 15], [26, 15], [15, 15]],总面积9950。
请求[61, 137],实际尺寸[61, 137],横边界[0, 9, 46, 61],纵边界[0, 19, 122, 137];按先行后列的九块宽高[[9, 19], [37, 19], [15, 19], [9, 103], [37, 103], [15, 103], [9, 15], [37, 15], [15, 15]],总面积8357。
请求[253, 68],实际尺寸[253, 68],横边界[0, 9, 238, 253],纵边界[0, 19, 53, 68];按先行后列的九块宽高[[9, 19], [229, 19], [15, 19], [9, 34], [229, 34], [15, 34], [9, 15], [229, 15], [15, 15]],总面积17204。
请求[92, 105],实际尺寸[92, 105],横边界[0, 9, 77, 92],纵边界[0, 19, 90, 105];按先行后列的九块宽高[[9, 19], [68, 19], [15, 19], [9, 71], [68, 71], [15, 71], [9, 15], [68, 15], [15, 15]],总面积9660。
请求[159, 177],实际尺寸[159, 177],横边界[0, 9, 144, 159],纵边界[0, 19, 162, 177];按先行后列的九块宽高[[9, 19], [135, 19], [15, 19], [9, 143], [135, 143], [15, 143], [9, 15], [135, 15], [15, 15]],总面积28143。
前两组专门检查小于或恰好等于最小尺寸时的退化中心,其余组检查正常伸缩。目标范围中不应出现负宽度或负高度。
所有源分块应该刚好覆盖源图;所有目标分块应该刚好覆盖实际目标。中心宽或高为零时允许退化为空区域,不要除以零去计算缩放倍率。
建议先遮住结果,用本例原始输入独立完成一遍,再逐项对照。若出现差异,先找最早不一致的位置,检查索引从零还是从一开始、边界是否包含,以及比较或更新发生的先后。只比较最后一个数,往往无法分辨规则理解与计算步骤分别出了什么问题。
这种最小尺寸处理是本练习的明确选择,并非所有界面系统都如此。实际实现也可能压缩边框或裁切内容。比较截图前,应先确认采用了哪一种小尺寸规则以及像素对齐方式。