欢迎光临
我们一直在努力

PHP使用GD库进行图片合成

<?php
/**
 *  @desc 图片合成代码逻辑示例
 *      需要用到TP框架、文字处理函数,微信登录判断等,仅作自我记录参考
 *  @usage 
        $MakeShareImg = new MakeShareImg($name,$subname,$content,$mimg);
$shareImg = $MakeShareImg->getShareImg();
 *  @author Deron 
 */
class MakeShareImg {
//用户名
private $username;
//地铁站名
private $subname;
//内容
private $content;
//内容组
private $contentArr;
//头像
private $avatar;
//画布
private $canvas;
//分享图片
private $shareimg;
 
public $wxLogin;
 
/**
* @desc 构造函数
         * @param string $username 用户名称
         * @param string $subname 地铁站名称
         * @param string $content 内容
         * @param string $avatar 头像地址
*/
public function __construct($username,$subname,$content,$avatar) {
$this->username = $username;
$this->subname  = $subname;
$this->content  = $content;
$this->avatar   = $avatar;
}
 
/**
* @desc 获取分享图片路径
*/
public function getShareImg() {
//初始化数据
$this->init();
//合成图片
if($this->wxLogin) {$this->meregimgdefault();}
else $this->mergeimg();
//返回合成后的图片
return $this->shareimg;
}
 
/**
* @desc 初始化
*/
public function init() {
//处理画布
$dir = 'xxxxxxxxxxxxxxxxx';
switch($this->subname) {
case 'xxx1':
if($this->wxLogin) {
$this->canvas = $dir . 'canvas_jjk_default.png';
} else {
$this->canvas = $dir . 'canvas_jjk.png';
}
break;
case 'xxx2':
if($this->wxLogin) {
$this->canvas = $dir . 'canvas_cc_default.png';
} else {
$this->canvas = $dir . 'canvas_cc.png';
}
break;
case 'xxx3':
if($this->wxLogin) {
$this->canvas = $dir . 'canvas_mn_default.png';
} else {
$this->canvas = $dir . 'canvas_mn.png';
}
break;
case 'xxx4':
if($this->wxLogin) {
$this->canvas = $dir . 'canvas_zc_default.png';
} else {
$this->canvas = $dir . 'canvas_zc.png';
}
break;
case 'xxx5':
if($this->wxLogin) {
$this->canvas = $dir . 'canvas_flm_default.png';
} else {
$this->canvas = $dir . 'canvas_flm.png';
}
break;
case 'xxx6':
if($this->wxLogin) {
$this->canvas = $dir . 'canvas_zl_default.png';
} else {
$this->canvas = $dir . 'canvas_zl.png';
}
break;
default:
$this->canvas = '';
}
 
//处理内容
$this->contentArr[0] = csubstr($this->content,0,15,false);
$this->contentArr[1] = csubstr($this->content,15,15,false);
$this->contentArr[2] = csubstr($this->content,30,15,false);
 
//排除截取字符串方法的BUG
if($this->contentArr[0] == $this->contentArr[1] && $this->contentArr[0] == $this->contentArr[2]) {
$this->contentArr[1] = '';
$this->contentArr[2] = '';
}
} 
 
private function meregimgdefault() {
//获取图像信息
$canvasInfo = $this->getImageInfo($this->canvas);
 
//建立图像
$canvasCreateFun = "imagecreatefrom" . $canvasInfo['type'];
$canvasImage = $canvasCreateFun($this->canvas);
 
//载入字体
$font = "./msyh.ttf"; 
 
//创建颜色,用于文字字体的白和阴影的黑
$ufcolor = imagecolorallocate($canvasImage,255,255,255); //用户名
$cfcolor = imagecolorallocate($canvasImage,91,44,46);
 
//计算文字位置
$fsize  = 16;
$fangle = 0;
$utop  = 85;
$uleft = 540;
$ctop  = 180;
$cleft = 540;
 
//在图片中插入文字,imagettftext (image,size,angle, x, y,color,fontfile,text) 图像,字形尺寸,字形角度,x坐标,y坐标,颜色,字体文件名称,字符串
if($this->username) imagettftext($canvasImage,$fsize,$fangle,$uleft,$utop,$ufcolor,$font,$this->username);
if($this->contentArr[0]) imagettftext($canvasImage,$fsize,$fangle,$cleft,$ctop-5,$cfcolor,$font,$this->contentArr[0]);
if($this->contentArr[1]) imagettftext($canvasImage,$fsize,$fangle,$cleft,$ctop+35,$cfcolor,$font,$this->contentArr[1]);
if($this->contentArr[2]) imagettftext($canvasImage,$fsize,$fangle,$cleft,$ctop+70,$cfcolor,$font,$this->contentArr[2]);
 
//设定图像的保持透明色
imagealphablending($canvasImage, false);
imagesavealpha($canvasImage,true);
 
//输出图像
$ImageFun = 'Image' . $canvasInfo['type'];
 
//保存图片路径
$savepath = 'xxxxxxxxxxxxxxxxx';
//生成的图像名称
$savename = 'default_flm_img.' .$canvasInfo['type'];
//保存图像
$ImageFun($canvasImage, $savepath.$savename);
 
//销毁对象
imagedestroy($canvasImage);
 
$this->shareimg = $savepath.$savename;
}
 
/**
* @desc 合成图片
*/
private function mergeimg() {
//获取图像信息
$canvasInfo = $this->getImageInfo($this->canvas);
 
//建立图像
$canvasCreateFun = "imagecreatefrom" . $canvasInfo['type'];
$canvasImage = $canvasCreateFun($this->canvas);
 
//载入字体
$font = "./msyh.ttf"; 
 
//创建颜色,用于文字字体的白和阴影的黑
$ufcolor = imagecolorallocate($canvasImage,255,255,255); //用户名
$cfcolor = imagecolorallocate($canvasImage,91,44,46);
 
//计算文字位置
$fsize  = 16;
$fangle = 0;
$utop  = 85;
$uleft = 540;
$ctop  = 180;
$cleft = 540;
 
//在图片中插入文字,imagettftext (image,size,angle, x, y,color,fontfile,text) 图像,字形尺寸,字形角度,x坐标,y坐标,颜色,字体文件名称,字符串
if($this->username) imagettftext($canvasImage,$fsize,$fangle,$uleft,$utop,$ufcolor,$font,$this->username);
if($this->contentArr[0]) imagettftext($canvasImage,$fsize,$fangle,$cleft,$ctop-5,$cfcolor,$font,$this->contentArr[0]);
if($this->contentArr[1]) imagettftext($canvasImage,$fsize,$fangle,$cleft,$ctop+35,$cfcolor,$font,$this->contentArr[1]);
if($this->contentArr[2]) imagettftext($canvasImage,$fsize,$fangle,$cleft,$ctop+70,$cfcolor,$font,$this->contentArr[2]);
 
//获取头像图像信息
$avatarInfo = $this->getImageInfo($this->avatar);
 
//判断头像是否符合标准
if($avatarInfo["width"] > $canvasInfo["width"] || $avatarInfo["height"] > $canvasInfo["height"])
exit("图片大小不符合");
 
//建立头像图像
$avatarCreateFun = "imagecreatefrom" . $avatarInfo['type'];
$avatarImage = $avatarCreateFun($this->avatar);
 
$aalpha = 90;
$posX = 40; 
$posY = 50; 
 
//生成混合图像 imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
//源图像,添加的图像,源图像x坐标,源图像y坐标,添加的图片的x左边,添加的图片的y坐标,添加的图片的宽度,添加的图片的高度,角度
imagecopymerge($canvasImage, $avatarImage, $posX, $posY, 0, 0, $avatarInfo['width'], $avatarInfo['height'], $aalpha);
 
//设定图像的保持透明色
imagealphablending($canvasImage, false);
imagesavealpha($canvasImage,true);
 
//输出图像
$ImageFun = 'Image' . $canvasInfo['type'];
 
//保存图片路径
$savepath = 'xxxxxxxxxxxxxxxxx';
//生成的图像名称
$savename = substr(substr($this->avatar,21),0,-4). '.' .$canvasInfo['type'];
//保存图像
$ImageFun($canvasImage, $savepath.$savename);
 
//销毁对象
imagedestroy($canvasImage);
imagedestroy($avatarImage);
 
$this->shareimg = $savepath.$savename;
}
 
/**
* @desc 获取图片信息
*/
privatefunction getImageInfo($img) {
        $imageInfo = getimagesize($img);
        if ($imageInfo !== false) {
            $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));
            $imageSize = filesize($img);
            $info = array(
                "width" => $imageInfo[0],
                "height" => $imageInfo[1],
                "type" => $imageType,
                "size" => $imageSize,
                "mime" => $imageInfo['mime']
            );
            return $info;
        } else {
            return false;
        }
    }
}
?>

 

赞(0)
版权归原作者所有,如有侵权请告知。达维营-前端网 » PHP使用GD库进行图片合成

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址