PHP图片合成(gd库)

时间:2022-10-24 00:18:15

<?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;

        }

    }

}

?>