update
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
#include <QTimer>
|
||||
#include <QUrl>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
namespace core {
|
||||
|
||||
ModelServerClient::ModelServerClient(QObject* parent)
|
||||
@@ -90,6 +92,7 @@ QNetworkReply* ModelServerClient::segmentSamPromptAsync(
|
||||
QNetworkReply* ModelServerClient::inpaintAsync(
|
||||
const QByteArray& cropRgbPngBytes,
|
||||
const QByteArray& maskPngBytes,
|
||||
const QString& modelName,
|
||||
const QString& prompt,
|
||||
const QString& negativePrompt,
|
||||
double strength,
|
||||
@@ -119,6 +122,9 @@ QNetworkReply* ModelServerClient::inpaintAsync(
|
||||
QJsonObject payload;
|
||||
payload.insert(QStringLiteral("image_b64"), QString::fromLatin1(cropRgbPngBytes.toBase64()));
|
||||
payload.insert(QStringLiteral("mask_b64"), QString::fromLatin1(maskPngBytes.toBase64()));
|
||||
if (!modelName.trimmed().isEmpty()) {
|
||||
payload.insert(QStringLiteral("model_name"), modelName.trimmed());
|
||||
}
|
||||
payload.insert(QStringLiteral("prompt"), prompt);
|
||||
payload.insert(QStringLiteral("negative_prompt"), negativePrompt);
|
||||
payload.insert(QStringLiteral("strength"), strength);
|
||||
@@ -128,6 +134,62 @@ QNetworkReply* ModelServerClient::inpaintAsync(
|
||||
return m_nam->post(req, body);
|
||||
}
|
||||
|
||||
QNetworkReply* ModelServerClient::animateCharacterSequenceAsync(
|
||||
const QByteArray& characterPngBytes,
|
||||
const QString& prompt,
|
||||
const QString& negativePrompt,
|
||||
const QString& backgroundColor,
|
||||
int backgroundTolerance,
|
||||
int frameCount,
|
||||
int numInferenceSteps,
|
||||
double guidanceScale,
|
||||
int maxSide,
|
||||
int seed,
|
||||
QString* outImmediateError
|
||||
) {
|
||||
if (outImmediateError) {
|
||||
outImmediateError->clear();
|
||||
}
|
||||
if (!m_baseUrl.isValid() || m_baseUrl.isEmpty()) {
|
||||
if (outImmediateError) *outImmediateError = QStringLiteral("后端地址无效。");
|
||||
return nullptr;
|
||||
}
|
||||
if (characterPngBytes.isEmpty()) {
|
||||
if (outImmediateError) *outImmediateError = QStringLiteral("角色 PNG 为空。");
|
||||
return nullptr;
|
||||
}
|
||||
if (prompt.trimmed().isEmpty()) {
|
||||
if (outImmediateError) *outImmediateError = QStringLiteral("动画提示词不能为空。");
|
||||
return nullptr;
|
||||
}
|
||||
if (frameCount <= 0) {
|
||||
if (outImmediateError) *outImmediateError = QStringLiteral("帧数必须大于 0。");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const QUrl url = m_baseUrl.resolved(QUrl(QStringLiteral("/animate/character_sequence")));
|
||||
QNetworkRequest req(url);
|
||||
req.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json"));
|
||||
|
||||
QJsonObject payload;
|
||||
payload.insert(QStringLiteral("image_b64"), QString::fromLatin1(characterPngBytes.toBase64()));
|
||||
payload.insert(QStringLiteral("model_name"), QStringLiteral("animatediff"));
|
||||
payload.insert(QStringLiteral("prompt"), prompt.trimmed());
|
||||
payload.insert(QStringLiteral("negative_prompt"), negativePrompt);
|
||||
payload.insert(QStringLiteral("background_color"), backgroundColor.trimmed().isEmpty()
|
||||
? QStringLiteral("#00FF00")
|
||||
: backgroundColor.trimmed());
|
||||
payload.insert(QStringLiteral("background_tolerance"), std::clamp(backgroundTolerance, 0, 255));
|
||||
payload.insert(QStringLiteral("video_length"), frameCount);
|
||||
payload.insert(QStringLiteral("num_inference_steps"), std::max(1, numInferenceSteps));
|
||||
payload.insert(QStringLiteral("guidance_scale"), guidanceScale);
|
||||
payload.insert(QStringLiteral("max_side"), std::clamp(maxSide, 128, 2048));
|
||||
payload.insert(QStringLiteral("seed"), seed);
|
||||
|
||||
const QByteArray body = QJsonDocument(payload).toJson(QJsonDocument::Compact);
|
||||
return m_nam->post(req, body);
|
||||
}
|
||||
|
||||
bool ModelServerClient::computeDepthPng8(
|
||||
const QByteArray& imageBytes,
|
||||
QByteArray& outPngBytes,
|
||||
|
||||
@@ -41,12 +41,27 @@ public:
|
||||
QNetworkReply* inpaintAsync(
|
||||
const QByteArray& cropRgbPngBytes,
|
||||
const QByteArray& maskPngBytes,
|
||||
const QString& modelName,
|
||||
const QString& prompt,
|
||||
const QString& negativePrompt,
|
||||
double strength,
|
||||
int maxSide,
|
||||
QString* outImmediateError = nullptr);
|
||||
|
||||
// POST /animate/character_sequence,JSON 响应由调用方解析(success / frames[] / fps / error)。
|
||||
QNetworkReply* animateCharacterSequenceAsync(
|
||||
const QByteArray& characterPngBytes,
|
||||
const QString& prompt,
|
||||
const QString& negativePrompt,
|
||||
const QString& backgroundColor,
|
||||
int backgroundTolerance,
|
||||
int frameCount,
|
||||
int numInferenceSteps,
|
||||
double guidanceScale,
|
||||
int maxSide,
|
||||
int seed,
|
||||
QString* outImmediateError = nullptr);
|
||||
|
||||
private:
|
||||
QNetworkAccessManager* m_nam = nullptr;
|
||||
QUrl m_baseUrl;
|
||||
|
||||
Reference in New Issue
Block a user