PHP 图片合成、仿微信群头像的方法示例

本文实例讲述了PHP 图片合成、仿微信群头像的方法,分享给大家供大家参考,具体如下:

示例代码:

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

调用示例:

  1. $img = array(
  2. 'http://localhost/1.png',
  3. 'http://localhost/2.png',
  4. 'http://localhost/3.png',
  5. 'http://localhost/4.png',
  6. 'http://localhost/5.png',
  7. 'http://localhost/6.png',
  8. 'http://localhost/7.png',
  9. 'http://localhost/8.png',
  10. 'http://localhost/9.png',
  11. 'http://localhost/10.png',
  12. );
  13. $a = getGroupAvatar($img,1,'./img/123.jpg');
  14. var_dump($a);