如何通过POST API正确配置Stable Diffusion的ReActor换脸扩展
解决C#调用Stable Diffusion ReActor换脸API的图像参数错误问题
错误原因
你遇到的opencv cvtColor src data type = 17 is not supported错误,本质是ReActor代码期望接收图像对象,但你传入的是未正确解析的Base64字符串(被当成了JSON对象)。问题出在ReActor替换人脸图的参数传递方式上——im字段并非API对外暴露的参数,直接传入Base64会导致解析失败。
正确的参数传递方案
ReActor的替换人脸图需要通过multipart/form-data格式上传,而非嵌套在JSON的im字段中。结合Inpaint模式的需求,完整的请求结构如下:
核心参数拆分
- 将源图、遮罩图、替换人脸图分别转为字节数组,作为
multipart/form-data的文件部分上传 - 其他配置参数(prompt、ReActor开关、模型选择等)打包为JSON字符串,放在
payload_json字段中
- 将源图、遮罩图、替换人脸图分别转为字节数组,作为
C#代码实现示例
var request = (HttpWebRequest)WebRequest.Create("http://你的SD-WebUI地址:7860/sdapi/v1/img2img"); request.Method = "POST"; var boundary = "----WebKitFormBoundary" + Guid.NewGuid().ToString("N"); request.ContentType = $"multipart/form-data; boundary={boundary}"; using (var stream = request.GetRequestStream()) { // 1. 写入配置JSON var payload = new { prompt = "你的提示词", negative_prompt = "你的反向提示词", init_images = new List<string>(), // 留空,通过文件上传传递 mask = "", // 留空,通过文件上传传递 inpainting_fill = 1, // Inpaint填充模式,按需调整 reactor_enabled = true, // 开启ReActor reactor_swapper = "inswapper_128.onnx", // 指定换脸模型 reactor_face_index = 0, // 目标人脸索引 // 其他ReActor参数按需添加 }; var payloadJson = Newtonsoft.Json.JsonConvert.SerializeObject(payload); WriteMultipartFormField(stream, boundary, "payload_json", payloadJson); // 2. 上传源图(init_images) var initImageBytes = Convert.FromBase64String("你的源图纯Base64(去掉data:image前缀)"); WriteMultipartFile(stream, boundary, "init_images", "init.png", "image/png", initImageBytes); // 3. 上传遮罩图(mask) var maskBytes = Convert.FromBase64String("你的遮罩图纯Base64(去掉data:image前缀)"); WriteMultipartFile(stream, boundary, "mask", "mask.png", "image/png", maskBytes); // 4. 上传ReActor替换人脸图 var reactorImageBytes = Convert.FromBase64String("你的替换人脸图纯Base64(去掉data:image前缀)"); WriteMultipartFile(stream, boundary, "reactor_source_image", "reactor.png", "image/png", reactorImageBytes); // 写入结束边界 var endBoundary = Encoding.ASCII.GetBytes($"--{boundary}--\r\n"); stream.Write(endBoundary, 0, endBoundary.Length); } // 发送请求并处理响应 using (var response = (HttpWebResponse)request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var reader = new StreamReader(responseStream)) { var result = reader.ReadToEnd(); // 处理返回的结果 } // 辅助方法:写入表单字段 void WriteMultipartFormField(Stream stream, string boundary, string name, string value) { var header = Encoding.ASCII.GetBytes($"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"\r\n\r\n"); stream.Write(header, 0, header.Length); var valueBytes = Encoding.UTF8.GetBytes(value); stream.Write(valueBytes, 0, valueBytes.Length); stream.Write(Encoding.ASCII.GetBytes("\r\n"), 0, 2); } // 辅助方法:写入文件 void WriteMultipartFile(Stream stream, string boundary, string name, string fileName, string contentType, byte[] fileBytes) { var header = Encoding.ASCII.GetBytes($"--{boundary}\r\nContent-Disposition: form-data; name=\"{name}\"; filename=\"{fileName}\"\r\nContent-Type: {contentType}\r\n\r\n"); stream.Write(header, 0, header.Length); stream.Write(fileBytes, 0, fileBytes.Length); stream.Write(Encoding.ASCII.GetBytes("\r\n"), 0, 2); }
- 关键注意事项
- 所有Base64字符串必须去掉
data:image/png;base64,这类前缀,只保留纯编码内容 - 替换人脸图的上传字段名为
reactor_source_image,这是ReActor扩展对外暴露的API字段 - 确保ReActor扩展已开启,且换脸模型(如
inswapper_128.onnx)已正确放置在扩展目录中
- 所有Base64字符串必须去掉
内容的提问来源于stack exchange,提问作者Alexandre Labedade
相关产品推荐
相关产品推荐

