CutImg.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace app\jobs;
  3. use think\queue\Job;
  4. use think\facade\Console;
  5. use app\model\VrFloder;
  6. use app\model\VrGroup;
  7. use app\model\VrView;
  8. use vr\Krpano;
  9. use OSS\OssClient;
  10. use think\facade\Log;
  11. set_time_limit(0);
  12. class CutImg
  13. {
  14. public function fire(Job $job, $queuedata)
  15. {
  16. // Log::close();
  17. try {
  18. if($job->attempts() > 2) {
  19. //通过这个方法可以检查这个任务已经重试了几次了
  20. $job->delete();
  21. }else{
  22. $res = $this->jobDone($queuedata);
  23. if($res){
  24. $job->delete();
  25. }else{
  26. VrView::where('id',$queuedata['view_id'])->update(['cut_img_status'=>3,'cut_img_ing'=>0]);
  27. }
  28. }
  29. } catch (OssException $e) {
  30. //报错直接结束
  31. VrView::where('id',$queuedata['view_id'])->update(['cut_img_status'=>3,'cut_img_ing'=>0]);
  32. $job->delete();
  33. }
  34. }
  35. public function failed($queuedata)
  36. {
  37. // ...任务达到最大重试次数后,失败了
  38. }
  39. //切图
  40. private function jobDone($data){
  41. // Log::close();
  42. // //场景信息
  43. $info = VrView::where('id',$data['view_id'])->field('id,vr_path,structure,vr_group_id')->findOrEmpty();
  44. // //切图中或切图完成直接结束
  45. if ($info->isEmpty() || in_array($info->cut_img_status,[4])) return true;
  46. // //切图开始时间
  47. $info->cut_img_time = time();
  48. $info->save();
  49. // //原图
  50. $ali_oss_bindurl = config('app.vr_ali_oss_bindurl');
  51. $url = 'https://' . $ali_oss_bindurl . '/';
  52. $path = $info->structure.$info->vr_path.'.jpg';
  53. $info->pic_path = $url.$path;
  54. //垃圾数据
  55. if(strpos($info->pic_path,'.jpg')===false) return false;
  56. //oss文件是否存在
  57. if(!$this->ossCheck($path)) return false;
  58. // //下载原图
  59. $inputfile = 'public/upload/wzh/'.$info->vr_path.'.jpg';// 原图保存地址
  60. // // $measurement = '?x-oss-process=image/resize,w_100';//下载图片尺寸
  61. $measurement = '';
  62. $this->dlfile($info->pic_path.$measurement,$inputfile);
  63. //下载原图失败
  64. if(!file_exists($inputfile)) return false;
  65. //开始切图
  66. $outputfilepath = 'public/upload/wzh/'.$info->vr_path.'/';//切图保存地址
  67. $krpano = new Krpano();
  68. $i = false;
  69. try {
  70. // 生成六面体的6张图
  71. $krpano->spheretocubeCube($inputfile, $outputfilepath);
  72. // 生成封面图
  73. $krpano->makepreview($inputfile, $outputfilepath);
  74. // 生成竖版预览图
  75. $krpano->spheretocubeVcube($inputfile, $outputfilepath);
  76. } catch (Exception $e) {
  77. trace($e->getMessage(), 'error');
  78. $i = true;
  79. }
  80. @unlink($inputfile);//删除本地原图
  81. $arr = ['image_b','image_d','image_f','image_l','image_r','image_u','preview','thumb'];
  82. //切图失败,可能只切成一张图
  83. if ($i) {
  84. foreach ($arr as $v1) {
  85. $img = $outputfilepath.$v1.'.jpg';//切图保存地址
  86. if(file_exists($img)) @unlink($img);////删除已经生成的切图
  87. }
  88. @rmdir('public/upload/wzh/'.$info->vr_path);//删除空文件夹
  89. return false;
  90. }
  91. //切图成功 上传oss
  92. $size = 0;//切图大小
  93. foreach ($arr as $v2) {
  94. //切图保存地址
  95. $img = $outputfilepath.$v2.'.jpg';
  96. $file = $info->structure.$v2.'.jpg';
  97. $res = $this->ossUpload($file,$img);
  98. if ($res) $size += filesize($img);
  99. @unlink($img);//删除本地文件
  100. }
  101. @rmdir('public/upload/wzh/'.$info->vr_path);//删除空文件夹
  102. $info->cut_img_status = 4;
  103. $info->cut_img_size = $size;
  104. $info->save();
  105. VrGroup::where('id',$info->vr_group_id)->inc('size',$size)->update();
  106. dataStatistics($info->root_id,'use_count',$size,'inc');//manage应用首页统计数据
  107. return true;
  108. }
  109. //下载图片
  110. private function dlfile($file_url, $save_to)
  111. {
  112. $in= fopen($file_url, "rb");
  113. $out= fopen($save_to, "wb");
  114. while ($chunk = fread($in,8192))
  115. {
  116. fwrite($out, $chunk, 8192);
  117. }
  118. fclose($in);
  119. fclose($out);
  120. }
  121. /*
  122. * oss文件上传
  123. */
  124. private function ossUpload($path, $file)
  125. {
  126. $accessKeyId = config('app.vr_ali_oss_access_key_id');
  127. $accessKeySecret = config('app.vr_ali_oss_access_key_secret');
  128. $endpoint = config('app.vr_ali_oss_end_point');
  129. $bucket = config('app.vr_ali_oss_bucket');
  130. $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  131. try {
  132. $oss->uploadFile($bucket, $path, $file);
  133. } catch (OssException $e) {
  134. return false;
  135. }
  136. return true;
  137. }
  138. /*
  139. * oss检测文件
  140. */
  141. private function ossCheck($file)
  142. {
  143. // $file = 'vr/2023/03/18/9F8E30932ECE44EB9C7FBC87A44FBD3D/9F8E30932ECE44EB9C7FBC87A44FBD3D.jpg';
  144. $accessKeyId = config('app.vr_ali_oss_access_key_id');
  145. $accessKeySecret = config('app.vr_ali_oss_access_key_secret');
  146. $endpoint = config('app.vr_ali_oss_end_point');
  147. $bucket = config('app.vr_ali_oss_bucket');
  148. $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  149. try {
  150. $exist = $oss->doesObjectExist($bucket, $file);
  151. return $exist;
  152. } catch (OssException $e) {
  153. return false;
  154. }
  155. }
  156. private function compress_image($source_url, $destination_url, $max_size) {
  157. //压缩后的宽高
  158. $arr = ['image_b'=>1000,'image_d'=>900,'image_f'=>900,'image_l'=>900,'image_r'=>900,'image_u'=>900,'preview'=>2500];
  159. if(!isset($arr[$max_size])) return false;
  160. $max_size = $arr[$max_size];
  161. $info = getimagesize($source_url);
  162. $width = $info[0];
  163. $height = $info[1];
  164. $mime = $info['mime'];
  165. // 创建图像
  166. $image = imagecreatefromjpeg($source_url);
  167. // 缩放图像
  168. $scale = min($max_size / $width, $max_size / $height);
  169. if ($scale < 1) {
  170. $new_width = (int)floor($scale * $width);
  171. $new_height = (int)floor($scale * $height);
  172. $new_image = imagescale($image, $new_width, $new_height);
  173. imagedestroy($image);
  174. $image = $new_image;
  175. }
  176. // 保存图像
  177. imagejpeg($image, $destination_url, 90);
  178. }
  179. }