-
PHP 图片合成、仿微信群头像的方法示例
本文实例讲述了PHP 图片合成、仿微信群头像的方法,分享给大家供大家参考,具体如下:
示例代码:
- /**
- * 合成图片
- * @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(emptyempty($pic_list) || emptyempty($save_path)){
- return false;
- }
- if($is_save){
- //如果需要保存,需要传保存地址
- if(emptyempty($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 && !emptyempty($image_mime_info['mime'])){
- $mime_arr = explode('/',$image_mime_info['mime']);
- if(is_array($mime_arr) && $mime_arr[0] == 'image' && !emptyempty($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);
原文链接:http://www.phpfensi.com/php/20220118/19576.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式