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


Posted in PHP onOctober 25, 2019

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

参考文章:

作者:凯歌~,php图片合成方法(多张图片合成一张)https://3water.com/article/129037.htm。
经过测试,略作调整和注释,感谢分享。
欢迎提出改善优化意见!

示例代码:

/**
 * 合成图片
 * @param array  $pic_list [图片列表数组]
 * @param boolean $is_save  [是否保存,true保存,false输出到浏览器]
 * @param string $save_path [保存路径]
 * @return boolean|string
 */
function getGroupAvatar($pic_list=array(),$is_save=false,$save_path=''){
  //验证参数
  if(empty($pic_list) || empty($save_path)){
    return false;
  }
  if($is_save){
    //如果需要保存,需要传保存地址
    if(empty($save_path)){
      return false;
    }
  }
  // 只操作前9个图片
  $pic_list = array_slice($pic_list, 0, 9);
  //设置背景图片宽高
  $bg_w = 150; // 背景图片宽度
  $bg_h = 150; // 背景图片高度
  //新建一个真彩色图像作为背景
  $background = imagecreatetruecolor($bg_w,$bg_h);
  //为真彩色画布创建白灰色背景,再设置为透明
  $color = imagecolorallocate($background, 202, 201, 201);
  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(2,5);
      $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(3,6);
      $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(4,7);
      $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;
    }
    //获取图片文件扩展类型和mime类型,判断是否是正常图片文件
    //非正常图片文件,相应位置空着,跳过处理
    $image_mime_info = @getimagesize($pic_path);
    if($image_mime_info && !empty($image_mime_info['mime'])){
      $mime_arr = explode('/',$image_mime_info['mime']);
      if(is_array($mime_arr) && $mime_arr[0] == 'image' && !empty($mime_arr[1])){
        switch($mime_arr[1]) {
          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 放置在背景中的起始位置
        // 0,0 裁剪的源头像的起点位置
        // $pic_w,$pic_h copy后的高度和宽度
        imagecopyresized($background,$resource,$start_x,$start_y,0,0,$pic_w,$pic_h,imagesx($resource),imagesy($resource));
      }
    }
    // 最后两个参数为原始图片宽度和高度,倒数两个参数为copy时的图片宽度和高度
    $start_x = $start_x + $pic_w + $space_x;
  }
  if($is_save){
    $dir = pathinfo($save_path,PATHINFO_DIRNAME);
    if(!is_dir($dir)){
      $file_create_res = mkdir($dir,0777,true);
      if(!$file_create_res){
        return false;//没有创建成功
      }
    }
    $res = imagejpeg($background,$save_path);
    imagedestroy($background);
    if($res){
      return true;
    }else{
      return false;
    }
  }else{
    //直接输出
    header("Content-type: image/jpg");
    imagejpeg($background);
    imagedestroy($background);
  }
}

调用示例:

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 中的str_replace 函数总结
Apr 27 PHP
php调用mysql数据 dbclass类
May 07 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
php中使用临时表查询数据的一个例子
Feb 03 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
一个php生成16位随机数的代码(两种方法)
Sep 16 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
java解析json方法总结
May 16 PHP
Laravel validate error处理,ajax,json示例
Oct 25 #PHP
laravel 错误处理,接口错误返回json代码
Oct 25 #PHP
laravel 实现用户登录注销并限制功能
Oct 24 #PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 #PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 #PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 #PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
Oct 24 #PHP
You might like
用Php实现链结人气统计
2006/10/09 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
python实现同一局域网下传输图片
2020/03/20 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
django form和field具体方法和属性说明
2020/07/09 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
瑞典灯具和照明网上商店:Lamp24.se
2018/03/17 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
求职信写作要突出重点
2014/01/01 职场文书
大学生就业策划书范文
2014/04/04 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
收入证明申请书
2015/06/12 职场文书
小学毕业感言100字
2015/07/30 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android