欢迎关注个人公众号零零糖,偶尔发发生活的牢骚~
一个文字转图片的小功能~
在做文字转图片的时候,发现再window下能成功转换,在linux下无法生成图片,经排查报错信息是
imagettftext(): any2eucjp(): invalid code in input string
搜索相关资料,得到解决办法。记录之。
linux下执行
whereis php
找到php路径后执行
/opt/php55/bin/php -i |grep configure
如下图红色方框所示,确定是php编译问题,导致linux无法生成图片。
解决办法
1.把此编译选项去掉;
2.使用mb_convert_encoding转换
mb_convert_encoding(‘测试’, 'HTML-ENTITIES', 'UTF-8');
如下:
/**
* 将文字转成图片
* @param array $text 文字 如$text=关注公众号零零糖 必传
* @param string $font_path 字体路径 必传
* @param number $font_size 字体大小 默认30
* @param array $text_color 字体颜色 默认随机
* @param bool $disturb 是否画干扰点和线
* @author Yoper
* @Wechat Yoperman
*/
function text_to_img($text,$font_path,$font_size=30,$text_color,$disturb=false) {
if(empty($text)){
echo 'text empty';
}
if(empty($font_path)){
echo 'font_path empty';
}
$gd_support = extension_loaded('gd');
if(!$gd_support){
echo 'gd not support';
}
$text_length=mb_strlen($text,'utf-8');
empty($text_color) && ($text_color=[rand(20, 100), rand(20, 100), rand(20, 100)]);
//单个文字宽度
$single_text_width=$font_size+10;
//图片大小
$width=$text_length*$single_text_width;//一个字50宽度,字越多越宽
$height=$single_text_width;//高度
$image = imagecreatetruecolor($width, $height);
//背景
$background = imagecolorallocate($image, 0, 0, 0);//白色
imagecolortransparent($image,$background); // 设置为透明色,若注释掉该行则输出上面设置的背景
imagefill($image, 0, 0, $background);
//是否画干扰
if($disturb){
//干扰点
for ($i=0; $i < 300; $i++) {
$pixColor = imagecolorallocate($image, rand(150, 240), rand(150, 240), rand(150, 240));
$pixX = rand(10, 190);
$pixY = rand(5, 55);
imagesetpixel($image, $pixX, $pixY, $pixColor);
}
//4条水平线
for ($i=0; $i < 5; $i++) {
$lineColor = imagecolorallocate($image, rand(50, 150), rand(50, 150), rand(50, 150));
$lineX1 = 0;
$lineX2 = 300;
$lineY1 = ($i + 1) * 12;
$lineY2 = ($i + 1) * 12;
imageline($image, $lineX1, $lineY1, $lineX2, $lineY2, $lineColor);
}
//10条垂直线
for ($i=0; $i < 30; $i++) {
$lineColor = imagecolorallocate($image, rand(50, 150), rand(50, 150), rand(50, 150));
$lineX1 = ($i + 1) * 10;
$lineX2 = ($i + 1) * 10;
$lineY1 = 0;
$lineY2 = 60;
imageline($image, $lineX1, $lineY1, $lineX2, $lineY2, $lineColor);
}
}
//文字
for ($i=0; $i < $text_length; $i++) {
$textColor = imagecolorallocate($image,$text_color[0], $text_color[1], $text_color[2]);
$textX = $i * $single_text_width;//文字X坐标
$textY=$single_text_width-10;
$text_angle=0;//旋转角度
$single_text=mb_substr($text, $i, 1,'utf-8');//获取单个文字
$single_text=mb_convert_encoding($single_text, 'HTML-ENTITIES', 'UTF-8');//对php编译--enable-gd-jis-conv的处理
imagettftext($image, $font_size,$text_angle, $textX, $textY, $textColor,$font_path,$single_text);
}
header("Content-Type:image/png");
imagepng($image);
imagedestroy($image);
}
//使用方法
$font_path='/fonts/STXINWEI.TTF';//请修改成自己路径的字体!可在C:\Windows\Fonts下复制出来
text_to_img('零零糖公众号',$font_path,30);
另外,在THINKPHP5.1中,图片不会直接呈现,会直接显示"乱码",即便代码中设置了Content-Type:image/png,在浏览器上观察依然是Content-Type:text/html; charset=utf-8
在header("Content-Type:image/png");前面加ob_end_clean();即可
...
ob_end_clean();
header("Content-Type:image/png");
...
END
码农转型写公众号中,欢迎关注,交流深夜的姿势,不要总是阅读毒鸡汤文~
零零糖公众号