您现在的位置是:网站首页 > PHP>PHP文字生成图片及多图片合成一张图片-生成海报功能
PHP文字生成图片及多图片合成一张图片-生成海报功能
- PHP
- 2018-11-20
- 540人已阅读
简介移动端很多场景都有分享海报功能,把多张图片与文字合成生成一张海报图片分享到朋友圈及社交平台。
移动端很多场景都有分享海报功能,把多张图片与文字合成生成一张海报图片分享到朋友圈及社交平台。
效果展示:
此案例分为图片与文字部分如下:
- 一张背景图片
- 用户微信图像图片
- 二维网址图片
- 活动标题文字
- 活动简介说明文字
下面是我个人封装的图片合成类文件:
字体文件代码文件在后面可以下载使用。
//字体数组 思源黑体
public static $fonts = [
'/fonts/syht/SourceHanSansCN-Bold.ttf',
'/fonts/syht/SourceHanSansCN-ExtraLight.ttf',
'/fonts/syht/SourceHanSansCN-Medium.ttf',
'/fonts/syht/SourceHanSansCN-Heavy.ttf',
'/fonts/syht/SourceHanSansCN-Light.ttf',
'/fonts/syht/SourceHanSansCN-Normal.ttf',
'/fonts/syht/SourceHanSansCN-Regular.ttf'
];
//活动生成海报测试
public function getTest(){
$url = 'http://'.$_SERVER['HTTP_HOST']; //当前域名
$position = [
[
$url.'/images/96.jpg', //微信图像
$url.'/images/rwm.png', //二维码地址
"?font=0&fontcolor=fc0000&size=14&bold=0&w=230&h=500&line=4&str=IT学无止境", //活动标题
"?font=5&fontcolor=282828&size=14&bold=0&w=440&h=500&line=4&str=快乐不是件奇怪的东西,绝不因为你分给了别人而减少。有时你分给别人的越多,自己得到的也就越多。这么好的课程,我希望能和最好的朋友一起学习。", //活动简介
],
[
['left'=>23,'top'=>969,'right'=>0,'bottom'=>0],
['left'=>447,'top'=>755,'right'=>0,'bottom'=>0],
['left'=>147,'top'=>970,'right'=>0,'bottom'=>0],
['left'=>147,'top'=>1005,'right'=>0,'bottom'=>0]
]
];
$img_bg = $url.'/images/bg.jpg'; //背景图片
$picname = 'tmpimg_'.time().str_pad(mt_rand(1, 999999999),9,'0',STR_PAD_LEFT).'.jpg'; //图片名称
self::generateImgfonts($img_bg,$position,$picname);
}
/**
* 功能:合成图片 可以图片与文字
* @param $source
* @param $position
*/
static function generateImgfonts($source, $position, $picname) {
$main = imagecreatefromjpeg ( $source );
$width = imagesx ( $main );
$height = imagesy ( $main );
$target = imagecreatetruecolor ( $width, $height );
$white = imagecolorallocate ( $target, 255, 255, 255 );
imagefill ( $target, 0, 0, $white );
imagecopyresampled ( $target, $main, 0, 0, 0, 0, $width, $height, $width, $height );
//文字图片循环合成
foreach($position[0] as $key=>$value){
//判断是网址还是文字
if(self::check_url($value)){
//图片地址合成处理
$info_img = getimagesize($value);
list($tmp_src, $type_src) = explode('/', $info_img['mime']);
switch (strtolower($type_src)) {
case 'png':
$src_img = imagecreatefrompng($value);
break;
case 'jpg':
$src_img = imagecreatefromjpeg($value);
break;
case 'jpeg':
$src_img = imagecreatefromjpeg($value);
break;
case 'gif':
$src_img = imagecreatefromgif($value);
break;
}
imagecopy($target,$src_img,$position[1][$key]['left'],$position[1][$key]['top'],$position[1][$key]['right'],$position[1][$key]['bottom'],$info_img[0],$info_img[1]);
imagedestroy($src_img);
}else{
$value = self::tplpicstr($value);
$fontSize = $value['size']; //磅值字体
$fontcolorart = self::hex2rgb($value['fontcolor']);
$fontColor = imagecolorallocate ( $target, $fontcolorart['red'], $fontcolorart['green'], $fontcolorart['blue'] ); //字的RGB颜色
$canvasWidth = $value['w'];
//判断是否固定宽度
if($canvasWidth !=0){
$text_msg = self::autowrap($fontSize, 0, $_SERVER['DOCUMENT_ROOT'].self::$fonts[$value['font']], $value['str'], $canvasWidth, $value['line']); //自动换行处理
}else{
$value['str'] = str_replace('㊌','&',$value['str']);
$text_msg = $value['str'];
}
imagettftext ( $target, $fontSize, 0, $position[1][$key]['left'], $position[1][$key]['top'], $fontColor, $_SERVER['DOCUMENT_ROOT'].self::$fonts[$value['font']], $text_msg);
}
}
/**** 查看图片合成效果开始 这里打开就可查看图片合成的效果 ****/
header("Content-type: image/jpeg");
imagejpeg ( $target, null, 100 );
imagedestroy ( $target );
/**** 查看图片全成效果结束 ****/
//合成图片生成目录 下面注释打开即可把合成的图片生成到对应目录,必须把上面查看图片合成效果关闭
//imagejpeg($target,"uploads/poster/".$picname,100);
}
/**
* 检测url地址
* @param $url
* @return int
*/
public static function check_url($url){
return preg_match('/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’:+!]*([^<>\"])*$/', $url);
}
/**
* 功能:将16进制的色值转换为RGB值
* @param $colour
* @return array|bool
*/
public static function hex2rgb( $colour ) {
if ( $colour[0] == '#' ) {
$colour = substr( $colour, 1 );
}
if ( strlen( $colour ) == 6 ) {
list( $r, $g, $b ) = array( $colour[0] . $colour[1], $colour[2] . $colour[3], $colour[4] . $colour[5] );
} elseif ( strlen( $colour ) == 3 ) {
list( $r, $g, $b ) = array( $colour[0] . $colour[0], $colour[1] . $colour[1], $colour[2] . $colour[2] );
} else {
return false;
}
$r = hexdec( $r );
$g = hexdec( $g );
$b = hexdec( $b );
return array( 'red' => $r, 'green' => $g, 'blue' => $b );
}
/**
* 功能:把参数转换成数组
* @param $str
* @return mixed
*/
static function tplpicstr($str){
$str = str_replace('?','',$str);
$art = explode('&',$str);
foreach($art as $key=>$value){
$font = explode('=',$value);
$data[$font[0]] = $font[1];
}
return $data;
}
/**
* 功能:段落文字自动换行
* @param $fontsize
* @param $angle
* @param $fontface
* @param $string
* @param $width
* @param $line
* @return string
*/
static function autowrap($fontsize, $angle, $fontface, $string, $width,$line=1)
{
// 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度
$content = "";
$teststr = "";
// 将字符串拆分成一个个单字 保存到数组 letter 中
for ($i = 0; $i < mb_strlen($string); $i++) {
$letter[] = mb_substr($string, $i, 1);
}
foreach ($letter as $l) {
$teststr .= $l;
$testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);
// 判断拼接后的字符串是否超过预设的宽度
if (($testbox[2] > $width) && ($content !== "")) {
$content .= "\n";
$teststr = '';
}
$content .= $l;
}
//判断获取几行文字
if($line !=1){
$art = explode("\n",$content);
$content = join("\n",array_slice($art,0,$line));
}
return $content;
}
/**
* 功能:判断文件是否存在
* @param $url
* @return int
*/
public static function img_exits($url){
return (@fopen($url, 'r')) ? true : false;
}
/**
* @ 通过curl方式获取指定的图片到本地
* @ 完整的图片地址
* @ 要存储的文件名
*/
public static function getImgdown($url = "", $filename = "")
{
//去除URL连接上面可能的引号
//$url = preg_replace( '/(?:^['"]+|['"/]+$)/', '', $url );
$hander = curl_init();
$fp = fopen($filename,'wb');
curl_setopt($hander,CURLOPT_URL,$url);
curl_setopt($hander,CURLOPT_FILE,$fp);
curl_setopt($hander,CURLOPT_HEADER,0);
curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
//curl_setopt($hander,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,当为false是直接显示出来
curl_setopt($hander,CURLOPT_TIMEOUT,60);
curl_exec($hander);
curl_close($hander);
fclose($fp);
Return true;
}
注意:
在使用多图片合成时如果图片资源跨域了不是本域名的地址,在生成图片时可能会缓慢,这时可以使用图片类中最后一个方法把外域的图片下载到本地的某个目录再使用本域名图片地址生成。
/**
* @ 通过curl方式获取指定的图片到本地
* @ 完整的图片地址
* @ 要存储的文件名
*/
public static function getImgdown($url = "", $filename = "")
{
//去除URL连接上面可能的引号
//$url = preg_replace( '/(?:^['"]+|['"/]+$)/', '', $url );
$hander = curl_init();
$fp = fopen($filename,'wb');
curl_setopt($hander,CURLOPT_URL,$url);
curl_setopt($hander,CURLOPT_FILE,$fp);
curl_setopt($hander,CURLOPT_HEADER,0);
curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
//curl_setopt($hander,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,当为false是直接显示出来
curl_setopt($hander,CURLOPT_TIMEOUT,60);
curl_exec($hander);
curl_close($hander);
fclose($fp);
Return true;
}
在把文字生成图片时修改下面的参数可以对生成图片进行相应的配置
//文字说明
$str_img = "?font=5&fontcolor=282828&size=14&bold=0&w=440&h=500&line=4&str=IT学无止境",
font=5 //使用字体数组的键值,此值字体数组对应
fontcolor=282828 //生成的字体颜色
size=14 //字体大小
bold=0 //字体是否加粗
w=440 //生成的字体显示宽度
h=500 //生成的字体显示高度
line=4 //生成字体显示最多几行
str=IT学无止境 //生成图片的文字信息
修改 $str_img 字符串的的参数就可对生成的文字时行调整。
版权声明:本文为博主原创文章,欢迎大家转载。 https://itxwzj.com/technology/1/PHP-text-generation-picture-and-multi-picture-composition-one-picture-generation-poster-function
下一篇:已经是最后一篇
最新评论
站长大王来回复你了,长点心吧!