ImageService.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. * sourceDir 源目录uploads/operate/ai/Preview/
  13. * outputDir 输出目录/uploads/operate/ai/dall-e/hua/
  14. * file_name 文件名0194b6fdd6203fda369d5e3b74b6b454.png
  15. */
  16. public function handleImage($params) {
  17. if (!isset($params["batch"])) {return false;}
  18. $arr = [];
  19. $batch = $params["batch"]; // 获取图像批量信息
  20. $num = $params["num"]; // 获取需要生成的实例数量
  21. // 获取模板
  22. // english_content 文生文提示词
  23. // content 图生文提示词
  24. $template = Db::name('template')
  25. ->field('id,english_content,content,ids')
  26. ->where('ids',1)
  27. ->find();
  28. // 遍历每个图像,进行处理
  29. foreach ($batch as $k => $v) {
  30. $baseItem = [
  31. "sourceDir" => $this->sourceDir($v, 1), //
  32. "outputDir" => $this->sourceDir($v, 2), //
  33. "file_name" => $this->sourceDir($v, 3), //
  34. "type" => $params['type'] ?? '', // 获取处理类型
  35. "selectedOption" => $params['selectedOption'], //文生图模型参数
  36. "prompt" => $template['content'],
  37. "width" => $params['width'],
  38. "height" => $params['height']
  39. ];
  40. // 创建$num个相同的项目并合并到$arr
  41. $arr = array_merge($arr, array_fill(0, $num, $baseItem));
  42. }
  43. // 设置基础字段
  44. $insertData = [
  45. 'create_time' => date('Y-m-d H:i:s'),
  46. 'old_image_file' => $params['old_image_file'],
  47. 'status' => '等待中',
  48. 'image_count' => count($arr),
  49. 'params' => json_encode($params, JSON_UNESCAPED_UNICODE)
  50. ];
  51. if (empty($params['type'])) {
  52. // 未指定类型,执行链式任务
  53. $insertData['model'] = "gpt-4-vision-preview,"."gpt-4,".$params['selectedOption'];
  54. $insertData['model_name'] = '文生图';
  55. // echo "<pre>";print_r($insertData);echo "<pre>";die;
  56. $task_id = Db::name('queue_logs')->insertGetId($insertData);
  57. $arr = array_map(function ($item) use ($task_id) {
  58. $item['type'] = '图生文';
  59. $item['chain_next'] = ['文生文', '文生图'];
  60. $item['task_id'] = $task_id;
  61. return $item;
  62. }, $arr);
  63. $payload = [
  64. 'task_id' => $task_id,
  65. 'data' => $arr
  66. ];
  67. Queue::push('app\job\ImageArrJob', $payload, "arrimage");
  68. } else {
  69. // 指定了单一任务
  70. switch ($params['type']) {
  71. case '图生文':
  72. $insertData['model'] = 'gpt-4-vision-preview';
  73. $insertData['model_name'] = '图生文';
  74. break;
  75. case '文生文':
  76. $insertData['model'] = 'gpt-4';
  77. $insertData['model_name'] = '文生文';
  78. break;
  79. case '文生图':
  80. $insertData['model'] = $params['selectedOption'];
  81. $insertData['model_name'] = '文生图';
  82. break;
  83. default:
  84. return false;
  85. }
  86. $task_id = Db::name('queue_logs')->insertGetId($insertData);
  87. $arr = array_map(function ($item) use ($params, $task_id) {
  88. $item['type'] = $params['type'];
  89. $item['task_id'] = $task_id;
  90. return $item;
  91. }, $arr);
  92. $payload = [
  93. 'task_id' => $task_id,
  94. 'data' => $arr
  95. ];
  96. Queue::push('app\job\ImageArrJob', $payload, "arrimage");
  97. }
  98. return true;
  99. }
  100. /**
  101. * 解析图像路径并返回相关信息
  102. *
  103. * @param string $filePath 图像文件路径
  104. * @param int $type 返回类型标识
  105. * @return string|null 返回解析后的路径或文件名
  106. */
  107. public function sourceDir($filePath, $type) {
  108. $arr = [];
  109. $pathParts = explode('/', $filePath);
  110. $filename = array_pop($pathParts); // 最后是文件名
  111. $baseParts = $pathParts;
  112. // 查找是否有 8 位数字(即日期)文件夹
  113. $date = '';
  114. foreach ($pathParts as $index => $part) {
  115. if (preg_match('/^\d{8}$/', $part)) {
  116. $date = $part;
  117. unset($baseParts[$index]); // 日期不算在 basePath 里
  118. break;
  119. }
  120. }
  121. $arr = [
  122. 'basePath' => implode('/', $baseParts),
  123. 'date' => $date,
  124. 'filename' => $filename
  125. ];
  126. // 根据类型返回不同路径
  127. if ($type == 1) {
  128. return $arr["basePath"]; // 只返回基础路径
  129. }
  130. if ($type == 2) {
  131. return '/' . str_replace('/Preview/', '/dall-e/', $arr["basePath"]) . $arr["date"];
  132. }
  133. if ($type == 3) {
  134. return $arr["filename"];
  135. }
  136. }
  137. }