|
|
@@ -26,6 +26,112 @@ class WorkOrder extends Api
|
|
|
$this->success('任务成功提交至队列');
|
|
|
}
|
|
|
|
|
|
+ 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]');
|
|
|
+ $scale = (float)$this->request->param('scale', 2.0); // 放大倍数
|
|
|
+
|
|
|
+ $imgRelPath = 'uploads/operate/ai/Preview/arr/0828004096727.png';
|
|
|
+ $imgPath = ROOT_PATH . 'public/' . $imgRelPath;
|
|
|
+
|
|
|
+ if (!file_exists($imgPath)) {
|
|
|
+ return json(['code' => 1, 'msg' => '原图不存在:' . $imgRelPath]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 编码原图为 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,
|
|
|
+ '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'];
|
|
|
+
|
|
|
+ $ch = curl_init();
|
|
|
+ curl_setopt($ch, CURLOPT_URL, $apiUrl);
|
|
|
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
|
+ curl_setopt($ch, CURLOPT_POST, true);
|
|
|
+ curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
|
|
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
|
|
|
+ curl_setopt($ch, CURLOPT_TIMEOUT, 90);
|
|
|
+ $response = curl_exec($ch);
|
|
|
+ $error = curl_error($ch);
|
|
|
+ curl_close($ch);
|
|
|
+
|
|
|
+ if ($error) {
|
|
|
+ return json(['code' => 1, 'msg' => '请求失败:' . $error]);
|
|
|
+ }
|
|
|
+
|
|
|
+ $data = json_decode($response, true);
|
|
|
+ if (!isset($data['images'][0])) {
|
|
|
+ return json(['code' => 1, 'msg' => '接口未返回图像数据']);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存原始生成图
|
|
|
+ $resultImg = base64_decode($data['images'][0]);
|
|
|
+ $saveDir = ROOT_PATH . 'public/uploads/img/';
|
|
|
+ if (!is_dir($saveDir)) {
|
|
|
+ mkdir($saveDir, 0755, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ $fileName = 'img2img_' . date('Ymd_His') . '_' . mt_rand(1000, 9999) . '.png';
|
|
|
+ $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' => '生成成功(未放大)',
|
|
|
+ 'data' => [
|
|
|
+ 'origin_url' => '/uploads/img/' . $fileName
|
|
|
+ ]
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 查询队列列表
|
|
|
* 统计文件对应的队列情况
|
|
|
@@ -43,6 +149,7 @@ class WorkOrder extends Api
|
|
|
$statusCount = Db::name('image_task_log')
|
|
|
->field('status, COUNT(*) as count')
|
|
|
->where('task_id', $taskId)
|
|
|
+ ->where('mod_rq', null)
|
|
|
->group('status')
|
|
|
->select();
|
|
|
$log['已完成数量'] = 0;
|
|
|
@@ -86,6 +193,7 @@ class WorkOrder extends Api
|
|
|
{
|
|
|
$statusList = Db::name('image_task_log')
|
|
|
->field('status, COUNT(*) as total')
|
|
|
+ ->where('mod_rq', null)
|
|
|
->where('create_time', '>=', date('Y-m-d 00:00:00'))
|
|
|
->group('status')
|
|
|
->select();
|
|
|
@@ -184,7 +292,11 @@ class WorkOrder extends Api
|
|
|
// 删除数据库中 log = '队列中' 的记录
|
|
|
Db::name('image_task_log')
|
|
|
->where('log', '队列中')
|
|
|
- ->delete();
|
|
|
+ ->update([
|
|
|
+ 'status' => "",
|
|
|
+ 'log' => '清空取消队列',
|
|
|
+ 'mod_rq' => date('Y-m-d H:i:s')
|
|
|
+ ]);
|
|
|
|
|
|
return json([
|
|
|
'code' => 0,
|