You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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模式的需求,完整的请求结构如下:

  1. 核心参数拆分

    • 将源图、遮罩图、替换人脸图分别转为字节数组,作为multipart/form-data的文件部分上传
    • 其他配置参数(prompt、ReActor开关、模型选择等)打包为JSON字符串,放在payload_json字段中
  2. 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);
}
  1. 关键注意事项
    • 所有Base64字符串必须去掉data:image/png;base64,这类前缀,只保留纯编码内容
    • 替换人脸图的上传字段名为reactor_source_image,这是ReActor扩展对外暴露的API字段
    • 确保ReActor扩展已开启,且换脸模型(如inswapper_128.onnx)已正确放置在扩展目录中

内容的提问来源于stack exchange,提问作者Alexandre Labedade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:22:52