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 相关文章推荐
Phpbean路由转发的php代码
Jan 10 PHP
PHP排序之二维数组的按照字母排序实现代码
Aug 13 PHP
php使用smtp发送支持附件的邮件示例
Apr 13 PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 PHP
php银联网页支付实现方法
Mar 04 PHP
php保存信息到当前Session的方法
Mar 16 PHP
PHP7.1新功能之Nullable Type用法分析
Sep 26 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
thinkPHP5.0框架开发规范简介
Mar 25 PHP
浅谈PHP错误类型及屏蔽方法
May 27 PHP
Laravel 自定命令以及生成文件的例子
Oct 23 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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 minixml详解
2008/07/19 PHP
PHP重定向的3种方式
2013/03/07 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
python多线程编程方式分析示例详解
2013/12/06 Python
跟老齐学Python之总结参数的传递
2014/10/10 Python
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python实现基于HTTP文件传输实例
2014/11/08 Python
python简单实现计算过期时间的方法
2015/06/09 Python
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
优秀教师工作感言
2014/02/16 职场文书
计划生育责任书
2015/05/09 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers