GroupAvatar.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace App\Services;
  3. class GroupAvatar
  4. {
  5. /**
  6. * 合成图片
  7. * @param array $pic_list [图片列表数组]
  8. * @param boolean $is_save [是否保存,true保存,false输出到浏览器]
  9. * @param string $save_path [保存路径]
  10. * @return boolean|string
  11. */
  12. public static function getGroupAvatar($pic_list=array(),$is_save=false,$save_path='')
  13. {
  14. // 只操作前9个图片
  15. $pic_list = array_slice($pic_list, 0, 9);
  16. //设置背景图片宽高
  17. $bg_w = 150; // 背景图片宽度
  18. $bg_h = 150; // 背景图片高度
  19. //新建一个真彩色图像作为背景
  20. $background = imagecreatetruecolor($bg_w,$bg_h);
  21. //为真彩色画布创建白灰色背景,再设置为透明
  22. $color = imagecolorallocate($background, 255, 255, 255);
  23. imagefill($background, 0, 0, $color);
  24. imageColorTransparent($background, $color);
  25. //根据图片个数设置图片位置
  26. $pic_count = count($pic_list);
  27. $lineArr = array();//需要换行的位置
  28. $space_x = 3;
  29. $space_y = 3;
  30. $line_x = 0;
  31. switch($pic_count) {
  32. case 1: // 正中间
  33. $start_x = intval($bg_w/4); // 开始位置X
  34. $start_y = intval($bg_h/4); // 开始位置Y
  35. $pic_w = intval($bg_w/2); // 宽度
  36. $pic_h = intval($bg_h/2); // 高度
  37. break;
  38. case 2: // 中间位置并排
  39. $start_x = 2;
  40. $start_y = intval($bg_h/4) + 3;
  41. $pic_w = intval($bg_w/2) - 5;
  42. $pic_h = intval($bg_h/2) - 5;
  43. $space_x = 5;
  44. break;
  45. case 3:
  46. $start_x = 40; // 开始位置X
  47. $start_y = 5; // 开始位置Y
  48. $pic_w = intval($bg_w/2) - 5; // 宽度
  49. $pic_h = intval($bg_h/2) - 5; // 高度
  50. $lineArr = array(2);
  51. $line_x = 4;
  52. break;
  53. case 4:
  54. $start_x = 4; // 开始位置X
  55. $start_y = 5; // 开始位置Y
  56. $pic_w = intval($bg_w/2) - 5; // 宽度
  57. $pic_h = intval($bg_h/2) - 5; // 高度
  58. $lineArr = array(3);
  59. $line_x = 4;
  60. break;
  61. case 5:
  62. $start_x = 30; // 开始位置X
  63. $start_y = 30; // 开始位置Y
  64. $pic_w = intval($bg_w/3) - 5; // 宽度
  65. $pic_h = intval($bg_h/3) - 5; // 高度
  66. $lineArr = array(3);
  67. $line_x = 5;
  68. break;
  69. case 6:
  70. $start_x = 5; // 开始位置X
  71. $start_y = 30; // 开始位置Y
  72. $pic_w = intval($bg_w/3) - 5; // 宽度
  73. $pic_h = intval($bg_h/3) - 5; // 高度
  74. $lineArr = array(4);
  75. $line_x = 5;
  76. break;
  77. case 7:
  78. $start_x = 53; // 开始位置X
  79. $start_y = 5; // 开始位置Y
  80. $pic_w = intval($bg_w/3) - 5; // 宽度
  81. $pic_h = intval($bg_h/3) - 5; // 高度
  82. $lineArr = array(2,5);
  83. $line_x = 5;
  84. break;
  85. case 8:
  86. $start_x = 30; // 开始位置X
  87. $start_y = 5; // 开始位置Y
  88. $pic_w = intval($bg_w/3) - 5; // 宽度
  89. $pic_h = intval($bg_h/3) - 5; // 高度
  90. $lineArr = array(3,6);
  91. $line_x = 5;
  92. break;
  93. case 9:
  94. $start_x = 5; // 开始位置X
  95. $start_y = 5; // 开始位置Y
  96. $pic_w = intval($bg_w/3) - 5; // 宽度
  97. $pic_h = intval($bg_h/3) - 5; // 高度
  98. $lineArr = array(4,7);
  99. $line_x = 5;
  100. break;
  101. }
  102. foreach( $pic_list as $k=>$pic_path ) {
  103. $kk = $k + 1;
  104. if ( in_array($kk, $lineArr) ) {
  105. $start_x = $line_x;
  106. $start_y = $start_y + $pic_h + $space_y;
  107. }
  108. //获取图片文件扩展类型和mime类型,判断是否是正常图片文件
  109. //非正常图片文件,相应位置空着,跳过处理
  110. $image_mime_info = @getimagesize($pic_path);
  111. if($image_mime_info && !empty($image_mime_info['mime'])){
  112. $mime_arr = explode('/',$image_mime_info['mime']);
  113. if(is_array($mime_arr) && $mime_arr[0] == 'image' && !empty($mime_arr[1])){
  114. switch($mime_arr[1]) {
  115. case 'jpg':
  116. case 'jpeg':
  117. $imagecreatefromjpeg = 'imagecreatefromjpeg';
  118. break;
  119. case 'png':
  120. $imagecreatefromjpeg = 'imagecreatefrompng';
  121. break;
  122. case 'gif':
  123. default:
  124. $imagecreatefromjpeg = 'imagecreatefromstring';
  125. $pic_path = file_get_contents($pic_path);
  126. break;
  127. }
  128. //创建一个新图像
  129. $resource = $imagecreatefromjpeg($pic_path);
  130. //将图像中的一块矩形区域拷贝到另一个背景图像中
  131. // $start_x,$start_y 放置在背景中的起始位置
  132. // 0,0 裁剪的源头像的起点位置
  133. // $pic_w,$pic_h copy后的高度和宽度
  134. imagecopyresized($background,$resource,$start_x,$start_y,0,0,$pic_w,$pic_h,imagesx($resource),imagesy($resource));
  135. }
  136. }
  137. // 最后两个参数为原始图片宽度和高度,倒数两个参数为copy时的图片宽度和高度
  138. $start_x = $start_x + $pic_w + $space_x;
  139. }
  140. if($is_save){
  141. $dir = pathinfo($save_path,PATHINFO_DIRNAME);
  142. if(!is_dir($dir)){
  143. $file_create_res = mkdir($dir,0777,true);
  144. if(!$file_create_res){
  145. return false;//没有创建成功
  146. }
  147. }
  148. $res = imagejpeg($background,$save_path);
  149. imagedestroy($background);
  150. if($res){
  151. return true;
  152. }else{
  153. return false;
  154. }
  155. }else{
  156. //直接输出
  157. header("Content-type: image/jpg");
  158. imagejpeg($background);
  159. imagedestroy($background);
  160. }
  161. }
  162. }