ImageService.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace app\service;
  3. use think\Db;
  4. use think\Queue;
  5. /**
  6. * ImageService 类用于处理图像任务。
  7. * 该类将前端传过来的多个图像信息推送到处理队列中。
  8. */
  9. class ImageService{
  10. /**
  11. * 处理图像并推送到队列中
  12. */
  13. public function handleImage($params) {
  14. if (!isset($params["batch"])) {return false;}
  15. $arr = [];
  16. $batch = $params["batch"]; // 获取图像批量信息
  17. $num = $params["num"]; // 获取需要生成的实例数量
  18. // 遍历每个图像,进行处理
  19. foreach ($batch as $k => $v) {
  20. $template = Db::name('template')
  21. ->field('id,english_content')
  22. ->where('ids',1)
  23. ->find();
  24. $baseItem = [
  25. "sourceDir" => $this->sourceDir($v, 1), // 获取源目录
  26. "outputDir" => $this->sourceDir($v, 2), // 获取输出目录
  27. "file_name" => $this->sourceDir($v, 3), // 获取文件名
  28. "type" => $params['type'] ?? '', // 获取处理类型
  29. "selectedOption" => $params['selectedOption'], //生图模型参数
  30. "prompt" => $template['content'], // 获取处理提示
  31. "width" => $params['width'], // 获取图像宽度
  32. "height" => $params['height'] // 获取图像高度
  33. ];
  34. // 创建$num个相同的项目并合并到$arr
  35. $arr = array_merge($arr, array_fill(0, $num, $baseItem));
  36. }
  37. // 设置基础字段
  38. $insertData = [
  39. 'create_time' => date('Y-m-d H:i:s'),
  40. 'old_image_file' => $params['old_image_file'],
  41. 'status' => '等待中',
  42. 'image_count' => count($arr),
  43. 'params' => json_encode($params, JSON_UNESCAPED_UNICODE)
  44. ];
  45. // 根据任务类型设定模型
  46. switch ($params['type']) {
  47. case '图生文':
  48. $insertData['model'] = 'gpt-4-vision-preview';
  49. break;
  50. case '文生文':
  51. $insertData['model'] = 'gpt-4';
  52. break;
  53. case '文生图':
  54. $insertData['model'] = $params['selectedOption'] ?? '未知模型';
  55. break;
  56. default:
  57. // 混合任务或自定义模型逻辑
  58. $selected = $params['selectedOption'] ?? '未知';
  59. $insertData['model'] = "gpt-4-vision-preview,gpt-4,{$selected}";
  60. break;
  61. }
  62. // 插入并获取任务 ID
  63. $task_id = Db::name('queue_logs')->insertGetId($insertData);
  64. // 推送到队列
  65. $payload = [
  66. 'task_id' => $task_id,
  67. 'data' => $arr
  68. ];
  69. //测试查看推送队列前的数据
  70. // echo "<pre>";print_r($payload);echo "<pre>";die;
  71. // 推送队列
  72. Queue::push('app\job\ImageArrJob', $payload, "arrimage");
  73. }
  74. /**
  75. * 解析图像路径并返回相关信息
  76. *
  77. * @param string $filePath 图像文件路径
  78. * @param int $type 返回类型标识
  79. * @return string|null 返回解析后的路径或文件名
  80. */
  81. public function sourceDir($filePath,$type){
  82. $arr = [];
  83. // 使用正则表达式匹配完整路径
  84. if (preg_match('/^(.+?)\/Preview\/(\d{8})\/(.+)$/', $filePath, $matches)) {
  85. $arr = [
  86. 'basePath' => $matches[1], // 基础路径
  87. 'date' => $matches[2], // 日期 (YYYYMMDD)
  88. 'filename' => $matches[3] // 文件名
  89. ];
  90. }else{
  91. // 备用方案:如果正则匹配失败
  92. $pathParts = explode('/', $filePath);
  93. $filename = array_pop($pathParts);
  94. $date = '';
  95. $baseParts = [];
  96. foreach ($pathParts as $part) {
  97. if (preg_match('/^\d{8}$/', $part)) {
  98. $date = $part;
  99. break;
  100. }
  101. $baseParts[] = $part;
  102. }
  103. $arr = [
  104. 'basePath' => implode('/', $baseParts),
  105. 'date' => $date,
  106. 'filename' => $filename
  107. ];
  108. }
  109. // 根据类型返回不同的路径
  110. if ($type == 1) {
  111. return $arr["basePath"] . "/Preview/" . $arr["date"]; // 返回预览目录
  112. }
  113. if ($type == 2) {
  114. return '/' . $arr["basePath"] . "/dall-e/" . $arr["date"]; // 返回输出目录
  115. }
  116. if($type==3){
  117. return $arr["filename"]; // 返回图片名称
  118. }
  119. }
  120. }