| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <?php
- namespace app\service;
- use think\Db;
- use think\Queue;
- /**
- * ImageService 类用于处理图像任务。
- * 该类将前端传过来的多个图像信息推送到处理队列中。
- */
- class ImageService{
- /**
- * 处理图像并推送到队列中
- * sourceDir 源目录uploads/operate/ai/Preview/
- * outputDir 输出目录/uploads/operate/ai/dall-e/hua/
- * file_name 文件名0194b6fdd6203fda369d5e3b74b6b454.png
- */
- public function handleImage($params) {
- if (!isset($params["batch"])) {return false;}
- $arr = [];
- $batch = $params["batch"]; // 获取图像批量信息
- $num = $params["num"]; // 获取需要生成的实例数量
- // 获取模板
- // english_content 文生文提示词
- // content 图生文提示词
- $template = Db::name('template')
- ->field('id,english_content,content,ids')
- ->where('ids',1)
- ->find();
- // 遍历每个图像,进行处理
- foreach ($batch as $k => $v) {
- $baseItem = [
- "sourceDir" => $this->sourceDir($v, 1), //
- "outputDir" => $this->sourceDir($v, 2), //
- "file_name" => $this->sourceDir($v, 3), //
- "type" => $params['type'] ?? '', // 获取处理类型
- "selectedOption" => $params['selectedOption'], //文生图模型参数
- "prompt" => $template['content'],
- "width" => $params['width'],
- "height" => $params['height']
- ];
- // 创建$num个相同的项目并合并到$arr
- $arr = array_merge($arr, array_fill(0, $num, $baseItem));
- }
- // 设置基础字段
- $insertData = [
- 'create_time' => date('Y-m-d H:i:s'),
- 'old_image_file' => $params['old_image_file'],
- 'status' => '等待中',
- 'image_count' => count($arr),
- 'params' => json_encode($params, JSON_UNESCAPED_UNICODE)
- ];
- if (empty($params['type'])) {
- // 未指定类型,执行链式任务
- $insertData['model'] = "gpt-4-vision-preview,"."gpt-4,".$params['selectedOption'];
- $insertData['model_name'] = '文生图';
- // echo "<pre>";print_r($insertData);echo "<pre>";die;
- $task_id = Db::name('queue_logs')->insertGetId($insertData);
- $arr = array_map(function ($item) use ($task_id) {
- $item['type'] = '图生文';
- $item['chain_next'] = ['文生文', '文生图'];
- $item['task_id'] = $task_id;
- return $item;
- }, $arr);
- $payload = [
- 'task_id' => $task_id,
- 'data' => $arr
- ];
- Queue::push('app\job\ImageArrJob', $payload, "arrimage");
- } else {
- // 指定了单一任务
- switch ($params['type']) {
- case '图生文':
- $insertData['model'] = 'gpt-4-vision-preview';
- $insertData['model_name'] = '图生文';
- break;
- case '文生文':
- $insertData['model'] = 'gpt-4';
- $insertData['model_name'] = '文生文';
- break;
- case '文生图':
- $insertData['model'] = $params['selectedOption'];
- $insertData['model_name'] = '文生图';
- break;
- default:
- return false;
- }
- $task_id = Db::name('queue_logs')->insertGetId($insertData);
- $arr = array_map(function ($item) use ($params, $task_id) {
- $item['type'] = $params['type'];
- $item['task_id'] = $task_id;
- return $item;
- }, $arr);
- $payload = [
- 'task_id' => $task_id,
- 'data' => $arr
- ];
- Queue::push('app\job\ImageArrJob', $payload, "arrimage");
- }
- return true;
- }
- /**
- * 解析图像路径并返回相关信息
- *
- * @param string $filePath 图像文件路径
- * @param int $type 返回类型标识
- * @return string|null 返回解析后的路径或文件名
- */
- public function sourceDir($filePath, $type) {
- $arr = [];
- $pathParts = explode('/', $filePath);
- $filename = array_pop($pathParts); // 最后是文件名
- $baseParts = $pathParts;
- // 查找是否有 8 位数字(即日期)文件夹
- $date = '';
- foreach ($pathParts as $index => $part) {
- if (preg_match('/^\d{8}$/', $part)) {
- $date = $part;
- unset($baseParts[$index]); // 日期不算在 basePath 里
- break;
- }
- }
- $arr = [
- 'basePath' => implode('/', $baseParts),
- 'date' => $date,
- 'filename' => $filename
- ];
- // 根据类型返回不同路径
- if ($type == 1) {
- return $arr["basePath"]; // 只返回基础路径
- }
- if ($type == 2) {
- return '/' . str_replace('/Preview/', '/dall-e/', $arr["basePath"]) . $arr["date"];
- }
- if ($type == 3) {
- return $arr["filename"];
- }
- }
- }
|