liuhairui 6 сар өмнө
parent
commit
d804532cca

+ 113 - 1
application/api/controller/WorkOrder.php

@@ -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,