ControlNet控图时最让人头疼的一类问题,是参考图本身结构标准,生成结果却像被一只无形的手拉宽或压扁:人物四肢比例失调、建筑横梁弯曲、透视莫名其妙地歪掉。这类变形十有八九不是模型能力不行,而是参考图分辨率、预处理器输出尺寸和最终生成尺寸三者没有对齐。Resize Mode决定参考图以什么方式被放进生成画布,Preprocessor Resolution决定预处理器在多大的画面上提取控制信息,把这两个参数的运作逻辑弄清楚,大部分变形问题都能当场解决。

变形的根源:一条环环相扣的分辨率链条
要理解变形从哪来,先要把ControlNet处理一张参考图的完整流程捋一遍。你丢进去的原图可能是手机直出的4000x3000,也可能是网上找来的800x600,尺寸五花八门。预处理器(比如openpose、canny、depth)并不会直接在原图上干活,而是先把图缩放到processor_res指定的分辨率,在这个尺寸上提取姿态骨架、边缘线条或深度信息,得到一张控制图。随后这张控制图还要经过Resize Mode的处理,被拉伸、裁剪或填充到与生成尺寸一致的画布上,模型才能拿它和噪声潜码做运算。
问题就出在这两次缩放上。假设你的参考图是16:9的横幅风景,而生成尺寸设置成了768x1152的竖版,宽高比一个是1.78,一个是0.67,差距悬殊。如果Resize Mode选了直接拉伸,控制图会被硬生生压成竖条,里面的建筑轮廓、地平线全部跟着扭曲,模型自然生成一张比例失调的图。反过来,只要参考图比例和生成比例接近,哪怕绝对尺寸差得很远,变形也不会发生,因为等比缩放不改变画面结构。
还有一个容易被忽略的细节:Preprocessor Resolution过低时,控制图本身就已经糊了。比如一张多人合照用256的预处理器分辨率去跑openpose,小脸的关键点会丢失、骨架线断断续续,模型拿到的控制信号本身就是残缺的,出来的图自然东倒西歪。所以排查变形问题时,不要只盯着Resize Mode,控制图的质量同样要检查,在WebUI里点一下预处理器结果预览,肉眼确认骨架或线条是否完整清晰。
Resize Mode四种模式逐一拆解
Resize Mode的四个选项,本质上是在回答同一个问题:当参考图比例和生成比例对不上时,牺牲什么。要么牺牲比例(拉伸变形),要么牺牲内容(裁剪),要么牺牲画面利用率(留边填充),没有两全的方案,只能根据素材情况挑一个代价最小的。先看整体对比,再逐个展开。
| 模式 | 处理方式 | 画面是否变形 | 适用场景 |
|---|---|---|---|
| Just Resize | 直接拉伸到生成尺寸 | 比例不一致时变形 | 参考图与生成图宽高比一致 |
| Crop and Resize | 等比缩放后居中裁剪 | 不变形,裁掉边缘 | 主体居中、边缘内容可舍弃 |
| Resize and Fill | 等比缩放后留边填充 | 不变形,出现空边 | 参考图内容必须完整保留 |
| Just Resize (Latent) | 在潜空间中直接缩放 | 轻微变形 | SDXL出图、结构精度要求不高 |
Just Resize是最直接也最危险的一个。它把控制图直接拉伸到生成尺寸,比例对得上时毫无问题,比例对不上时变形立竿见影。很多人默认用这个模式翻车,就是因为没意识到自己在拿横图生成竖图。如果你能保证参考图和生成图比例一致,比如参考图2:3、生成也设成2:3,Just Resize反而是最干净的选择,画面利用率百分之百,没有任何信息损耗。
Crop and Resize的思路是等比缩放参考图,直到它完全覆盖生成区域,然后把超出部分裁掉。一张16:9的图要变成3:4,左右两侧会被切掉一块。人物站在画面正中央时这个模式很好用,损失的是无关紧要的背景;但如果主体贴着边缘,或者你要的是全景构图,裁剪就会把关键内容切没。用之前可以先在心里按比例估算一下,被裁掉的区域是否包含必须保留的元素。
Resize and Fill正好相反,它等比缩放参考图直到能塞进生成区域,空出来的地方用填充色交给模型自己去补内容。优点是参考信息一点不丢,缺点是填充区域的生成质量不可控,可能出现明显的接缝或者怪异的延展。适合参考图内容珍贵、宁可让模型自由发挥也不能裁的场景,比如文物照片、特定产品的控图还原。
Just Resize (Latent)是四个模式里比较特殊的一个,它跳过像素层面的缩放,直接在潜空间里对控制信号做resize。由于潜空间的表征方式和像素图不同,变形程度通常比像素层面的直接拉伸轻一些,但依然存在。这个模式在SDXL工作流里比较常见,因为SDXL的生成分辨率普遍在1024级别,参考图经过潜空间缩放的损耗相对可以接受,速度上也更有优势。
Preprocessor Resolution怎么取值才合理
Preprocessor Resolution控制的是预处理器的工作分辨率,可以理解为控制图的清晰度。这个值不是越大越好,也不是越小越快那么简单,它需要和生成尺寸、模型版本以及预处理器类型放在一起考虑。
对SD1.5系列模型,生成尺寸通常在512x768这个量级,预处理器分辨率设512是稳妥的起点。如果你用SDXL或者直接出1024以上的大图,预处理器分辨率也应该跟着提到768甚至更高,否则控制图被放大到潜空间尺寸时会出现明显的模糊和锯齿。线条类预处理器(canny、lineart)对此尤其敏感,边缘一糊,模型对结构的约束力就直线下降,生成结果开始自由发挥。
不同预处理器对分辨率的敏感度也不一样。openpose这类骨架提取器,分辨率太低会导致小脸关键点丢失、手指骨架断裂,多人场景建议至少512起步;depth和normal这类需要细腻渐变的预处理器,分辨率高一点能保留更多层次细节,景深过渡更自然;而canny这类边缘检测,分辨率过低会让密集线条粘连成一团,控制图看起来像一团乱麻。一个实用的判断方法是开启预处理器结果预览直接看效果:线条清晰、骨架完整、细节层次分明,说明分辨率够用,反之就该往上加。
还要注意一点,预处理器分辨率拉高是有代价的。处理耗时增加只是小事,更重要的是高分辨率控制图携带的信息量更大,对生成的约束更死,有时反而限制了模型的发挥空间,出图显得呆板。如果你发现生成的图结构准确但缺少变化、怎么抽卡都一个样,可以试着把预处理器分辨率适当调低,给模型留一点自由发挥的余地。
一套可以直接照搬的设置流程
把前面的原理落地成操作步骤,遇到变形问题时按顺序走一遍,基本都能定位原因。第一步先看比例:查一下参考图的宽高比,再对照生成尺寸的宽高比,两者是否一致。一致就直接用Just Resize,不一致就根据内容重要性在Crop and Resize和Resize and Fill之间二选一。第二步定预处理器分辨率:SD1.5配512,SDXL或大图配768以上,然后看预览确认控制图质量。第三步才是抽卡看效果,如果还有轻微变形,再微调控制权重或更换控制模型版本。
举个完整的例子。参考图是一张800x1200的站姿人物照,比例2:3,生成目标设为768x1152,同样是2:3,比例完全对齐。这种情况下Resize Mode选Just Resize,预处理器用openpose_full,分辨率设512,控制图会被干净地缩放进生成画布,人物姿态稳定复现,不会有任何拉伸。假如参考图换成1920x1080的横构图,生成尺寸不变,比例从16:9变成2:3,此时就该切到Crop and Resize,左右各裁掉一部分背景,人物主体只要居中就能保住。
如果你习惯用API或脚本调用,这些参数同样可以通过接口传递。下面是一段调用WebUI接口的示例代码,展示了resize_mode和processor_res的写法:
import requests
url = "http://127.0.0.1:7860/sdapi/v1/txt2img"
payload = {
"prompt": "a girl standing in a garden, masterpiece, best quality",
"negative_prompt": "lowres, bad anatomy",
"width": 768,
"height": 1152,
"steps": 28,
"cfg_scale": 7,
"alwayson_scripts": {
"controlnet": {
"args": [
{
"input_image": "此处填参考图的base64字符串",
"module": "openpose_full",
"model": "control_v11p_sd15_openpose",
"weight": 1.0,
"processor_res": 512,
"resize_mode": 1
}
]
}
}
}
response = requests.post(url, json=payload)
print(response.status_code)代码里resize_mode的取值对应关系要记牢:0是Just Resize,1是Crop and Resize,2是Resize and Fill,3是Just Resize (Latent)。写脚本时传错数字是高频翻车点,明明想裁剪结果传了0,出来的图怎么都不对劲,排查半天才发现是模式选错了。processor_res则和界面里的Preprocessor Resolution是同一个参数,改名不改义,取值逻辑完全一致。
最后整理一份速查清单,出图变形时逐条对照,能覆盖绝大多数情况:
- 参考图宽高比与生成尺寸宽高比是否一致,不一致时是否选了非拉伸类的Resize Mode
- Preprocessor Resolution是否与生成尺寸量级匹配,SD1.5配512,SDXL配768以上
- 预处理器结果预览中控制图是否清晰完整,骨架断点、线条粘连都需要提高分辨率
- API调用时resize_mode的数字与预期模式是否对应
- 更换参考图之后是否忘了重新检查比例,尤其是横竖构图切换的时候
一句话总结:Resize Mode管的是参考图怎么塞进画布,Preprocessor Resolution管的是控制图有多清晰,前者对齐比例,后者对齐量级,两条都做到位,ControlNet的出图就能稳住结构不跑偏,横图竖图随意切换也不再变形。

