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 file_get_contents函数轻松采集html数据
Apr 22 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
基于PHP实现商品成交时发送短信功能
May 11 PHP
Yii2基于Ajax自动获取表单数据的方法
Aug 10 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
PHP 代码简洁之道(小结)
Oct 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书写安全的脚本代码
2012/02/05 PHP
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
jquery 指南/入门基础
2007/11/30 Javascript
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
点击页面其它地方隐藏该div的两种思路
2013/11/18 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
js滚动条平滑移动示例代码
2016/03/29 Javascript
jquery replace方法去空格
2017/05/08 jQuery
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
刷新页面后让控制台的js代码继续执行
2019/09/20 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python标准库os库的函数介绍
2020/02/12 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
药学专业大学生自荐信
2013/09/28 职场文书
干部行政关系介绍信
2014/01/17 职场文书
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
表扬信格式模板
2015/05/05 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python