|
|
@@ -26,13 +26,19 @@ class WorkOrder extends Api
|
|
|
$this->success('任务成功提交至队列');
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 图生图
|
|
|
+ * /sdapi/v1/img2img
|
|
|
+ */
|
|
|
public function imgtowimg()
|
|
|
{
|
|
|
$prompt = $this->request->param('prompt', '');
|
|
|
- $denoising = (float)$this->request->param('denoising_strength', 0.2);//重绘幅度
|
|
|
- $modelName = $this->request->param('model', 'realisticVisionV51_v51VAE-inpainting.safetensors [f0d4872d24]');
|
|
|
+ $denoising = (float)$this->request->param('denoising_strength', 0.2); // 重绘幅度
|
|
|
$scale = (float)$this->request->param('scale', 2.0); // 放大倍数
|
|
|
+ $modelName = $this->request->param('model', 'realisticVisionV51_v51VAE-inpainting.safetensors [f0d4872d24]');
|
|
|
|
|
|
+ //原图路径
|
|
|
$imgRelPath = 'uploads/operate/ai/Preview/arr/0828004096727.png';
|
|
|
$imgPath = ROOT_PATH . 'public/' . $imgRelPath;
|
|
|
|
|
|
@@ -40,26 +46,32 @@ class WorkOrder extends Api
|
|
|
return json(['code' => 1, 'msg' => '原图不存在:' . $imgRelPath]);
|
|
|
}
|
|
|
|
|
|
- // 编码原图为 base64
|
|
|
+ list($originW, $originH) = getimagesize($imgPath);
|
|
|
+ $targetW = intval($originW * $scale);
|
|
|
+ $targetH = intval($originH * $scale);
|
|
|
+
|
|
|
+ // 将原图转为 base64
|
|
|
$imgData = file_get_contents($imgPath);
|
|
|
$base64Img = base64_encode($imgData);
|
|
|
$initImage = 'data:image/png;base64,' . $base64Img;
|
|
|
|
|
|
- // 构造接口请求数据(宽高不传)
|
|
|
+ // 构造请求体
|
|
|
$postData = json_encode([
|
|
|
'prompt' => $prompt,
|
|
|
'steps' => 30,
|
|
|
'cfg_scale' => 7,
|
|
|
- 'inpainting_fill' => 1,
|
|
|
-
|
|
|
'denoising_strength' => $denoising,
|
|
|
+ 'width' => $targetW,
|
|
|
+ 'height' => $targetH,
|
|
|
+ 'resize_mode' => 1, // 缩放模式
|
|
|
+ 'inpaint_full_res' => true,
|
|
|
+ 'inpainting_fill' => 1,
|
|
|
'init_images' => [$initImage],
|
|
|
'override_settings' => [
|
|
|
'sd_model_checkpoint' => $modelName
|
|
|
]
|
|
|
]);
|
|
|
|
|
|
- // 发送 POST 请求到 img2img 接口
|
|
|
$apiUrl = "http://20.0.17.233:45001/sdapi/v1/img2img";
|
|
|
$headers = ['Content-Type: application/json'];
|
|
|
|
|
|
@@ -83,7 +95,7 @@ class WorkOrder extends Api
|
|
|
return json(['code' => 1, 'msg' => '接口未返回图像数据']);
|
|
|
}
|
|
|
|
|
|
- // 保存原始生成图
|
|
|
+ // 保存生成图像
|
|
|
$resultImg = base64_decode($data['images'][0]);
|
|
|
$saveDir = ROOT_PATH . 'public/uploads/img/';
|
|
|
if (!is_dir($saveDir)) {
|
|
|
@@ -94,39 +106,9 @@ class WorkOrder extends Api
|
|
|
$savePath = $saveDir . $fileName;
|
|
|
file_put_contents($savePath, $resultImg);
|
|
|
|
|
|
- // 放大图像处理
|
|
|
- $imageResource = imagecreatefromstring($resultImg);
|
|
|
- if ($imageResource && $scale > 1) {
|
|
|
- $originW = imagesx($imageResource);
|
|
|
- $originH = imagesy($imageResource);
|
|
|
- $scaledW = (int)($originW * $scale);
|
|
|
- $scaledH = (int)($originH * $scale);
|
|
|
-
|
|
|
- $resized = imagecreatetruecolor($scaledW, $scaledH);
|
|
|
- imagecopyresampled($resized, $imageResource, 0, 0, 0, 0, $scaledW, $scaledH, $originW, $originH);
|
|
|
-
|
|
|
- $zoomName = 'img2img_zoom_' . date('Ymd_His') . '_' . mt_rand(1000, 9999) . '.png';
|
|
|
- $zoomPath = $saveDir . $zoomName;
|
|
|
- imagepng($resized, $zoomPath);
|
|
|
-
|
|
|
- imagedestroy($resized);
|
|
|
- imagedestroy($imageResource);
|
|
|
-
|
|
|
- return json([
|
|
|
- 'code' => 0,
|
|
|
- 'msg' => '生成并放大成功',
|
|
|
- 'data' => [
|
|
|
-// 'origin_url' => '/uploads/img/' . $fileName,
|
|
|
- 'zoom_url' => '/uploads/img/' . $zoomName
|
|
|
- ]
|
|
|
- ]);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
return json([
|
|
|
'code' => 0,
|
|
|
- 'msg' => '生成成功(未放大)',
|
|
|
+ 'msg' => '图像生成成功',
|
|
|
'data' => [
|
|
|
'origin_url' => '/uploads/img/' . $fileName
|
|
|
]
|
|
|
@@ -134,6 +116,17 @@ class WorkOrder extends Api
|
|
|
}
|
|
|
|
|
|
|
|
|
+ // 后期图片处理
|
|
|
+ /**
|
|
|
+ * 后期图片处理
|
|
|
+ * /sdapi/v1/extra-single-image
|
|
|
+ */
|
|
|
+ public function extra_image()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 查询队列列表
|
|
|
* 统计文件对应的队列情况
|