| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <?php
- namespace app\service;
- use think\Db;
- use think\Queue;
- /**
- * ImageService 类用于处理图像任务。
- * 该类将前端传过来的多个图像信息推送到处理队列中。
- */
- class ImageService{
- /**
- * 处理图像并推送到队列中
- */
- public function handleImage($params) {
- if (!isset($params["batch"])) {return false;}
- $arr = [];
- $batch = $params["batch"]; // 获取图像批量信息
- $num = $params["num"]; // 获取需要生成的实例数量
- // 遍历每个图像,进行处理
- 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" => $params['prompt'], // 获取处理提示
- "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)
- ];
- // 根据任务类型设定模型
- switch ($params['type']) {
- case '图生文':
- $insertData['model'] = 'gpt-4-vision-preview';
- break;
- case '文生文':
- $insertData['model'] = 'gpt-4';
- break;
- case '文生图':
- $insertData['model'] = $params['selectedOption'] ?? '未知模型';
- break;
- default:
- // 混合任务或自定义模型逻辑
- $selected = $params['selectedOption'] ?? '未知';
- $insertData['model'] = "gpt-4-vision-preview,gpt-4,{$selected}";
- break;
- }
- // 插入并获取任务 ID
- $task_id = Db::name('queue_logs')->insertGetId($insertData);
- // 推送到队列
- $payload = [
- 'task_id' => $task_id,
- 'data' => $arr
- ];
- //测试查看推送队列前的数据
- // echo "<pre>";print_r($payload);echo "<pre>";die;
- // 推送队列
- Queue::push('app\job\ImageArrJob', $payload, "arrimage");
- }
- /**
- * 解析图像路径并返回相关信息
- *
- * @param string $filePath 图像文件路径
- * @param int $type 返回类型标识
- * @return string|null 返回解析后的路径或文件名
- */
- public function sourceDir($filePath,$type){
- $arr = [];
- // 使用正则表达式匹配完整路径
- if (preg_match('/^(.+?)\/Preview\/(\d{8})\/(.+)$/', $filePath, $matches)) {
- $arr = [
- 'basePath' => $matches[1], // 基础路径
- 'date' => $matches[2], // 日期 (YYYYMMDD)
- 'filename' => $matches[3] // 文件名
- ];
- }else{
- // 备用方案:如果正则匹配失败
- $pathParts = explode('/', $filePath);
- $filename = array_pop($pathParts);
- $date = '';
- $baseParts = [];
- foreach ($pathParts as $part) {
- if (preg_match('/^\d{8}$/', $part)) {
- $date = $part;
- break;
- }
- $baseParts[] = $part;
- }
- $arr = [
- 'basePath' => implode('/', $baseParts),
- 'date' => $date,
- 'filename' => $filename
- ];
- }
- // 根据类型返回不同的路径
- if ($type == 1) {
- return $arr["basePath"] . "/Preview/" . $arr["date"]; // 返回预览目录
- }
- if ($type == 2) {
- return '/' . $arr["basePath"] . "/dall-e/" . $arr["date"]; // 返回输出目录
- }
- if($type==3){
- return $arr["filename"]; // 返回图片名称
- }
- }
- }
|