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+Html+缓存
Nov 25 PHP
DEDE采集大师官方留后门的删除办法
Jan 08 PHP
php 按指定元素值去除数组元素的实现方法
Nov 04 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
PHP中几种常见的超时处理全面总结
Sep 11 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
PHP中的日期加减方法示例
Aug 21 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
May 11 PHP
php开发工具有哪五款
Nov 09 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
Jun 06 PHP
PHP的消息通信机制测试实例
Nov 10 PHP
php 处理png图片白色背景色改为透明色的实例代码
Dec 10 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
反射调用private方法实践(php、java)
2015/12/21 PHP
php简单获取复选框值的方法
2016/05/11 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
js 多种变量定义(对象直接量,数组直接量和函数直接量)
2010/05/24 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
python实现大文本文件分割
2019/07/22 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
python getpass实现密文实例详解
2019/09/24 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
房屋过户委托书范本
2014/10/07 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
离婚被告代理词
2015/05/23 职场文书
公司员工离职感言
2015/08/03 职场文书
优质服务标语口号
2015/12/26 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android