登录

php如何实现图片合并功能

php笔记 置顶
0 1598

在实际的开发中需要用到合并图片的功能,比如实现微信中的头像图片合并功能。

这里主要是使用的gd库去操作的,当然还可以用ImageMagick去实现这个功能。

效果如下:

如何用php gd库实现微信中的图片合并功能

php代码:

  1. $pics   = array(
  2.     '1.jpg'
  3.     '2.jpg'
  4.     '3.jpg'
  5.     '4.jpg'
  6.     '5.jpg'
  7.     '6.jpg'
  8.     '7.jpg'
  9.     '8.jpg'
  10.     '9.jpg'
  11. );
  12.  
  13. $pic_list    = array_slice($pics 0 9); // 只操作前9个图片
  14.  
  15. $bg_w    = 200; // 背景图片宽度
  16. $bg_h    = 200; // 背景图片高度
  17.  
  18. $background = imagecreatetruecolor($bg_w$bg_h); // 背景图片
  19. $color   = imagecolorallocate($background 255 255 255); // 为真彩色画布创建白色背景,再设置为透明
  20. imagefill($background 0 0 $color);
  21. imageColorTransparent($background $color);
  22.  
  23. $pic_count  = count($pic_list);
  24. $lineArr    = array();  // 需要换行的位置
  25. $space_x    = 3;
  26. $space_y    = 3;
  27. $line_x  = 0;
  28. switch($pic_count) {
  29.     case 1: // 正中间
  30.         $start_x    = intval($bg_w/4);  // 开始位置X
  31.         $start_y    = intval($bg_h/4);  // 开始位置Y
  32.         $pic_w   = intval($bg_w/2); // 宽度
  33.         $pic_h   = intval($bg_h/2); // 高度
  34.         break;
  35.     case 2: // 中间位置并排
  36.         $start_x    = 2;
  37.         $start_y    = intval($bg_h/4) + 3;
  38.         $pic_w   = intval($bg_w/2) - 5;
  39.         $pic_h   = intval($bg_h/2) - 5;
  40.         $space_x    = 5;
  41.         break;
  42.     case 3:
  43.         $start_x    = 40;   // 开始位置X
  44.         $start_y    = 5;    // 开始位置Y
  45.         $pic_w   = intval($bg_w/2) - 5; // 宽度
  46.         $pic_h   = intval($bg_h/2) - 5; // 高度
  47.         $lineArr    = array(2);
  48.         $line_x  = 4;
  49.         break;
  50.     case 4:
  51.         $start_x    = 4;    // 开始位置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(3);
  56.         $line_x  = 4;
  57.         break;
  58.     case 5:
  59.         $start_x    = 30;   // 开始位置X
  60.         $start_y    = 30;   // 开始位置Y
  61.         $pic_w   = intval($bg_w/3) - 5; // 宽度
  62.         $pic_h   = intval($bg_h/3) - 5; // 高度
  63.         $lineArr    = array(3);
  64.         $line_x  = 5;
  65.         break;
  66.     case 6:
  67.         $start_x    = 5;    // 开始位置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(4);
  72.         $line_x  = 5;
  73.         break;
  74.     case 7:
  75.         $start_x    = 53;   // 开始位置X
  76.         $start_y    = 5;    // 开始位置Y
  77.         $pic_w   = intval($bg_w/3) - 5; // 宽度
  78.         $pic_h   = intval($bg_h/3) - 5; // 高度
  79.         $lineArr    = array(25);
  80.         $line_x  = 5;
  81.         break;
  82.     case 8:
  83.         $start_x    = 30;   // 开始位置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(36);
  88.         $line_x  = 5;
  89.         break;
  90.     case 9:
  91.         $start_x    = 5;    // 开始位置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(47);
  96.         $line_x  = 5;
  97.         break;
  98. }
  99. foreach( $pic_list as $k=>$pic_path ) {
  100.     $kk = $k + 1;
  101.     if ( in_array($kk $lineArr) ) {
  102.         $start_x    = $line_x;
  103.         $start_y    = $start_y + $pic_h + $space_y;
  104.     }
  105.     $pathInfo    = pathinfo($pic_path);
  106.     switch( strtolower($pathInfo['extension']) ) {
  107.         case 'jpg':
  108.         case 'jpeg':
  109.             $imagecreatefromjpeg    = 'imagecreatefromjpeg';
  110.             break;
  111.         case 'png':
  112.             $imagecreatefromjpeg    = 'imagecreatefrompng';
  113.             break;
  114.         case 'gif':
  115.         default:
  116.             $imagecreatefromjpeg    = 'imagecreatefromstring';
  117.             $pic_path    = file_get_contents($pic_path);
  118.             break;
  119.     }
  120.     $resource   = $imagecreatefromjpeg($pic_path);
  121.     // $start_x$start_y copy图片在背景中的位置
  122.     // 00 被copy图片的位置
  123.     // $pic_w$pic_h copy后的高度和宽度
  124.     // 最后两个参数为原始图片宽度和高度,倒数两个参数为copy时的图片宽度和高度
  125.     imagecopyresized($background$resource$start_x$start_y00$pic_w$pic_himagesx($resource)imagesy($resource));
  126.     $start_x    = $start_x + $pic_w + $space_x;
  127. }
  128.  
  129. header("Content-type: image/jpg");
  130. imagejpeg($background);

发表评论

0 个回复