php如何实现图片合并功能
在实际的开发中需要用到合并图片的功能,比如实现微信中的头像图片合并功能。
这里主要是使用的gd库去操作的,当然还可以用ImageMagick去实现这个功能。
效果如下:
php代码:
- $pics = array(
- '1.jpg'
- '2.jpg'
- '3.jpg'
- '4.jpg'
- '5.jpg'
- '6.jpg'
- '7.jpg'
- '8.jpg'
- '9.jpg'
- );
- $pic_list = array_slice($pics 0 9); // 只操作前9个图片
- $bg_w = 200; // 背景图片宽度
- $bg_h = 200; // 背景图片高度
- $background = imagecreatetruecolor($bg_w$bg_h); // 背景图片
- $color = imagecolorallocate($background 255 255 255); // 为真彩色画布创建白色背景,再设置为透明
- imagefill($background 0 0 $color);
- imageColorTransparent($background $color);
- $pic_count = count($pic_list);
- $lineArr = array(); // 需要换行的位置
- $space_x = 3;
- $space_y = 3;
- $line_x = 0;
- switch($pic_count) {
- case 1: // 正中间
- $start_x = intval($bg_w/4); // 开始位置X
- $start_y = intval($bg_h/4); // 开始位置Y
- $pic_w = intval($bg_w/2); // 宽度
- $pic_h = intval($bg_h/2); // 高度
- break;
- case 2: // 中间位置并排
- $start_x = 2;
- $start_y = intval($bg_h/4) + 3;
- $pic_w = intval($bg_w/2) - 5;
- $pic_h = intval($bg_h/2) - 5;
- $space_x = 5;
- break;
- case 3:
- $start_x = 40; // 开始位置X
- $start_y = 5; // 开始位置Y
- $pic_w = intval($bg_w/2) - 5; // 宽度
- $pic_h = intval($bg_h/2) - 5; // 高度
- $lineArr = array(2);
- $line_x = 4;
- break;
- case 4:
- $start_x = 4; // 开始位置X
- $start_y = 5; // 开始位置Y
- $pic_w = intval($bg_w/2) - 5; // 宽度
- $pic_h = intval($bg_h/2) - 5; // 高度
- $lineArr = array(3);
- $line_x = 4;
- break;
- case 5:
- $start_x = 30; // 开始位置X
- $start_y = 30; // 开始位置Y
- $pic_w = intval($bg_w/3) - 5; // 宽度
- $pic_h = intval($bg_h/3) - 5; // 高度
- $lineArr = array(3);
- $line_x = 5;
- break;
- case 6:
- $start_x = 5; // 开始位置X
- $start_y = 30; // 开始位置Y
- $pic_w = intval($bg_w/3) - 5; // 宽度
- $pic_h = intval($bg_h/3) - 5; // 高度
- $lineArr = array(4);
- $line_x = 5;
- break;
- case 7:
- $start_x = 53; // 开始位置X
- $start_y = 5; // 开始位置Y
- $pic_w = intval($bg_w/3) - 5; // 宽度
- $pic_h = intval($bg_h/3) - 5; // 高度
- $lineArr = array(25);
- $line_x = 5;
- break;
- case 8:
- $start_x = 30; // 开始位置X
- $start_y = 5; // 开始位置Y
- $pic_w = intval($bg_w/3) - 5; // 宽度
- $pic_h = intval($bg_h/3) - 5; // 高度
- $lineArr = array(36);
- $line_x = 5;
- break;
- case 9:
- $start_x = 5; // 开始位置X
- $start_y = 5; // 开始位置Y
- $pic_w = intval($bg_w/3) - 5; // 宽度
- $pic_h = intval($bg_h/3) - 5; // 高度
- $lineArr = array(47);
- $line_x = 5;
- break;
- }
- foreach( $pic_list as $k=>$pic_path ) {
- $kk = $k + 1;
- if ( in_array($kk $lineArr) ) {
- $start_x = $line_x;
- $start_y = $start_y + $pic_h + $space_y;
- }
- $pathInfo = pathinfo($pic_path);
- switch( strtolower($pathInfo['extension']) ) {
- case 'jpg':
- case 'jpeg':
- $imagecreatefromjpeg = 'imagecreatefromjpeg';
- break;
- case 'png':
- $imagecreatefromjpeg = 'imagecreatefrompng';
- break;
- case 'gif':
- default:
- $imagecreatefromjpeg = 'imagecreatefromstring';
- $pic_path = file_get_contents($pic_path);
- break;
- }
- $resource = $imagecreatefromjpeg($pic_path);
- // $start_x$start_y copy图片在背景中的位置
- // 00 被copy图片的位置
- // $pic_w$pic_h copy后的高度和宽度
- // 最后两个参数为原始图片宽度和高度,倒数两个参数为copy时的图片宽度和高度
- imagecopyresized($background$resource$start_x$start_y00$pic_w$pic_himagesx($resource)imagesy($resource));
- $start_x = $start_x + $pic_w + $space_x;
- }
- header("Content-type: image/jpg");
- imagejpeg($background);