ImageService.php 4.4 KB

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