代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
PHP
】
长微博图片生成(可包含图片)
作者:
许志锋
/ 发布于
2014/5/20
/
595
长微博图片生成(可包含图片,初步设置只允许前两张图片,另外本方法图片排版比较麻烦,故暂设置两张图片) 简单的文本生成图片较为简单,但是如果需要富文本则相对比较麻烦
<?php /** * * 长微博图片生成 * @param unknown_type 文章id * @param unknown_type 文章内容(可根据id获取,这里直接传值) * @param unknown_type $img_path图片保存硬路径 * @param unknown_type $img_path_url图片路径url */ function weibo_img_create($article_id,$text,$title='',$img_path='',$img_path_url=''){ $font = dirname(__FILE__)."/droid.ttf"; $pid = $article_id; //分段p标签处理 $p_count = substr_count($text,''); //分段标签个数 $content = preg_replace("/<\/p>/isU","\n",$text); //分段标签 //图片img标签处理 $all_img_height = 0; if(preg_match_all("/<img[^>]*src=\"([^\"]*)\"[^>]*>/", $content, $m)) { //只取前两张图片 $m[0] = array_slice($m[0],0,2); $m[1] = array_slice($m[1],0,2); //保存图片资源 foreach($m[1] as $i=>$src) { $imgs[] = $src; } //获取所有图片 foreach($imgs as $i=>$image) { $ext = end(explode(".", $image)); $im = null; switch($ext) { case "gif": $im = imagecreatefromgif($image); break; case "png": $im = imagecreatefrompng($image); break; case "jpeg": $im = imagecreatefromjpeg($image); break; case "jpg": $im = imagecreatefromjpeg($image); break; } $imgs[$i] = array( '0'=>$im, 'height'=>floor(410/imagesx($im)*imagesy($im)), //按比例缩放 ); } $content = strip_tags($content,'<img>'); foreach($m[0] as $i=>$full) { //$replace_con = str_repeat("\n",ceil($imgs[$i]['height']/25)); $content = str_replace_once($full, 'img-pos-pos'.$i,$content); //只替换一次,防止出现相同的 //$img_pos[$i] = mb_strpos($content, 'img-pos-pos'.$i); //使用去除img标签后的文本 //$imgs[$i]['img_pos'] = $img_pos[$i]; $imgs[$i]['full'] = $full; //$content = str_replace('img-pos-pos'.$i,$replace_con, $content); //$all_img_height += $imgs[$i]['height']; } $all_img_height += $imgs[0]['height']; $content = strip_tags($content.'endendend');//防止添加的换行符/空格被删除 } $content = strip_tags($content); //$content = SpHtml2Text($content);//转化为文本 $content = autowrap(12, 0, $font, $content, 395); // 自动换行处理 if(!empty($imgs)){ foreach($imgs as $i=>$v){ $replace_con = str_repeat("\n",ceil($v['height']/25)); $img_pos[$i] = mb_strpos($content, 'img-pos-pos'.$i); //使用去除img标签后的文本 $imgs[$i]['img_pos'] = $img_pos[$i]; $content = str_replace('img-pos-pos'.$i,$replace_con, $content); } } //$add_footer_input = "\n自定义底部添加\n\n\n";//自定义底部 $input = str_replace("\r", "", stripcslashes($content)); //$input = str_replace(" ", "", stripcslashes($input)); //$title = explode("\n\n", $input); $ary = imagettfbbox (12, 0, $font, $input); $width = abs($ary[2] - $ary[0]) + 40; $height = abs($ary[1] - $ary[7]) + 220 + 215 + $p_count*25; //高清图片代替imagecreate(),若内容无图片建议使用imagecreate $img = @imagecreatetruecolor($width, $height); $bg_color=imagecolorallocate($img,229,231,230); imagecolortransparent($img,$bg_color); // 设置为透明色,若注释掉该行则输出上面设置的背景 imagefill($img,0,0,$bg_color); $bgcolor = imagecolorallocate($img, '250', '250', '250'); $bdcolor = imagecolorallocate($img, '250', '250', '250'); $color = imagecolorallocate($img, '0', '0', '0'); $color_title = imagecolorallocate($img, '250', '140', '0'); $input = str_replace('endendend','',$input); //去除添加的干扰符 imagettftext($img, 12, 0, 20, 160, $color, $font, $input); imagettftext($img, 18, 0, 21, 160, $color_title, $font, $title); imagerectangle($img, 0, 0, imagesx($img) - 1, imagesy($img) - 1, $bdcolor); //这里配置图标保存路径 $img_path = dirname(__FILE__).'/../../weibo_img'; $img_path_url = '/wp-content/weibo_img'; //$img_path = empty($img_path)?'':$img_path; //$img_path_url = empty($img_path_url)?'':$img_path_url; //合成公共头部/底部图片 if(file_exists($img_path.'/weibo_header.jpg') && file_exists($img_path.'/weibo_footer.jpg')){ $child1 = imagecreatefromjpeg($img_path.'/weibo_header.jpg'); $child2 = imagecreatefromjpeg($img_path.'/weibo_footer.jpg'); imagecopymerge ( $img, $child1, 0, 40, 0, 0, imagesx ( $child1 ), imagesy ( $child1 ), 100 ); imagecopymerge ( $img, $child2, 0, $height-215, 0, 0, imagesx ( $child2 ), imagesy ( $child2 ), 100 ); } //图片加入(img标签) if(!empty($imgs)){ $before_img_height = 0; foreach($imgs as $i=>$v){ $child = $v[0]; $part_content = mb_substr($content,0,$v['img_pos'],'utf-8'); $rows_count = get_wrap_height(12, 0, $font, $part_content , 300); $dst_y = ($rows_count+7)*27 - 9 + $before_img_height; $before_img_height += $v['height'] + 25;//累计占用高度 imagecopyresampled($img,$child,18,$dst_y,0,0,'410',$v['height'],imagesx($child),imagesy($child)); } } //生成图片返回图片链接 $file = empty($img_path)?'img/p-' . $pid . '.png':$img_path.'/p-'.$pid.'.png'; imagepng($img, $file); imagedestroy($img); if(empty($img_path_url)){ return 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI']) . '/' . $file; }else{ return 'http://' . $_SERVER['HTTP_HOST'] . $img_path_url . '/p-'.$pid.'.png'; } } /** * html转化为text * @param inputString * @return */ function SpHtml2Text($str){ //$str = strip_tags($str); $str = preg_replace("/<sty(.*)\\/style>|<scr(.*)\\/script>|<!--(.*)-->/isU","\n",$str); $alltext = ""; $start = 1; for($i=0;$i<strlen($str);$i++){ if($start==0 && $str[$i]==">"){ $start = 1; }elseif($start==1){ if($str[$i]=="<"){ $start = 0; $alltext .= " "; }elseif(ord($str[$i])>31){ $alltext .= $str[$i]; } } } $alltext = str_replace(" "," ",$alltext); $alltext = preg_replace("/&([^;&]*)(;|&)/","",$alltext); $alltext = preg_replace("/[ ]+/s"," ",$alltext); return $alltext; } /** * * 自动换行处理 * @param unknown_type $fontsize字体大小 * @param unknown_type $angle角度 * @param unknown_type $fontface字体名称(最好使用绝对路径) * @param unknown_type $string字符串 * @param unknown_type $width预设宽度 */ function autowrap($fontsize, $angle, $fontface, $string, $width) { $content = ""; $letter = array(); // 将字符串拆分成一个个单字 保存到数组 letter 中 for ($i=0;$i<mb_strlen($string);$i++) { $letter[] = mb_substr($string, $i, 1); } foreach ($letter as $l) { $teststr = $content." ".$l; $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr); // 判断拼接后的字符串是否超过预设的宽度 if (($testbox[2] > $width) && ($content !== "")) { $content .= "\n"; } $content .= $l; } return $content; } /** * * 获取一定文字换行后的行数(高度) * @param unknown_type $fontsize字体大小 * @param unknown_type $angle角度 * @param unknown_type $fontface字体名称(最好使用绝对路径) * @param unknown_type $string字符串 * @param unknown_type $width预设宽度 */ function get_wrap_height($fontsize, $angle, $fontface, $string, $width) { $content = ""; $rows_count = 0; $letter = array(); // 将字符串拆分成一个个单字 保存到数组 letter 中 for ($i=0;$i<mb_strlen($string);$i++) { $letter[] = mb_substr($string, $i, 1); } foreach ($letter as $l) { $teststr = $content." ".$l; $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr); // 判断拼接后的字符串是否超过预设的宽度 if (($testbox[2] > $width) && ($content !== "")) { $content .= "\n"; $rows_count += 1; }else{ $rows_count += 1/$width; } $content .= $l; } return $rows_count; } /** * * 替换函数(替换一次) * @param unknown_type $needle * @param unknown_type $replace * @param unknown_type $haystack */ function str_replace_once($needle, $replace, $haystack) { $pos = strpos($haystack, $needle); if ($pos === false) { return $haystack; } return substr_replace($haystack, $replace, $pos, strlen($needle)); } ?>
试试其它关键字
长微博
同语言下
.
用net匹配并替换iOS标准的emoji表情符号
.
处理带Emoji表情的的字符串
.
获取微信昵称时 过滤特殊字符
.
通过判断上传文件的头字符来判断文件的类型
.
模拟百度URL加密解密算法
.
以太坊检查地址是否合法
.
实现crontab解析类
.
获取每个月的开始和结束时间
.
图片上传工具类
.
APP手机应用信息采集
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
许志锋
贡献的其它代码
(
3
)
.
随机产生一个汉字
.
长微博图片生成(可包含图片)
.
十六进制字符串转数字
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3