编程语言
首页 > 编程语言> > 使用php,根据输入的文字自动生成图片,并把文字在图片上展示出来

使用php,根据输入的文字自动生成图片,并把文字在图片上展示出来

作者:互联网

背景:

为了减少服务器内图片的数量,采用了同事介绍的这种图片展示方式,用着还不错

 

需要准备的东西:

字体库(.ttf的文件)存放在font文件夹下

样式图片(.jpg是背景图规格大小是800*500,.png是用于放输出文字的地方600*400)存放在image文件夹下

php版本(5.6X左右就好,不建议到7.X因为之前用过7.3的版本出问题了),并且php开启gd库.

文件层级:

 

 

 

代码很简单,就一个文件就好 url.php(这个文件是要与伪静态中的配置对应起来)

  1 <?php
  2 $numrand=rand(1,2);
  3  
  4 $bgimg ='./image/'.$numrand.'.jpg';
  5 $bg_info = getimagesize($bgimg);
  6 //获取图片的后缀
  7 $bg_type = image_type_to_extension($bg_info[2], false);
  8 //拼接图片资源句柄函数
  9 $func = 'imagecreatefrom' . $bg_type;
 10 //创建图片资源句柄
 11 $bg_image = $func($bgimg);
 12 //图1处理
 13 $numrand2=rand(1,2);
 14 $tu1 ='./image/'.$numrand2.'.png';
 15 $tu1_info = getimagesize($tu1);
 16 $tu1_type = image_type_to_extension($tu1_info[2], false);
 17 //创建图片资源句柄
 18 $tu1_func = 'imagecreatefrom' . $tu1_type;
 19 $tu1_image = $tu1_func($tu1);
 20 //合并背景图+图1
 21 imagecopy($bg_image, $tu1_image, 100, 50, 0, 0, 600, 400);  //图1 200距左边距 50距顶边距 301 299图1大小  背景图 0 0
 22 //图2处理  二维码
 23 $tu2 = './image/'.$numrand2.'.png';
 24 $tu2_mark = getimagesize($tu2);
 25 $tu2_type = image_type_to_extension($tu2_mark[2], false);
 26 //创建图片资源句柄
 27 $tu2_func = 'imagecreatefrom' . $tu2_type;
 28 $tu2_image = $tu2_func($tu2);
 29 //合并背景图+二维码
 30 imagecopy($bg_image, $tu2_image, 583, 1193, 0, 0, 258, 261);
 31 //文字
 32 $get=$_GET['title'];
 33  
 34 $len = mb_strlen($get,'utf-8');
 35  
 36 $gettxtone=mb_substr($get,0,12,'utf-8');
 37 $gettxttwo=mb_substr($get,12,13,'utf-8');
 38 $gettxtsan=mb_substr($get,25,13,'utf-8');
 39  
 40 $text1 = preg_split('/(?<!^)(?!$)/u', $gettxtone);
 41 $text2 = preg_split('/(?<!^)(?!$)/u', $gettxttwo);
 42 $text3 = preg_split('/(?<!^)(?!$)/u', $gettxtsan);
 43  
 44 //水印开关
 45 $waterturn=1; //1是水印开,否则是关
 46 if($waterturn==1){
 47 //添加水印
 48 $waterfont="我是水印";
 49 $waterfont = preg_split('/(?<!^)(?!$)/u', $waterfont);
 50 //水印的x轴
 51 $waterx=620;
 52 //水印的y轴
 53 $watery=480;
 54 //水印结束
 55 }
 56  
 57 $color = imagecolorallocate($bg_image, 255,255,255);//字体颜色
 58 //随机字体
 59 $fontrand=rand(1,8);
 60 $font = "./font/".$fontrand.".ttf"; //字体文件
 61 $font_lposition = [110, 60]; //距左边距
 62 $font_tposition = [220, 120]; //距上边距
 63 $height=500;
 64 $width=800;
 65 $height =$height +  $h*$size;
 66  
 67 //这里根据是否有第三行文字,设置第一行的高度
 68 $num_size = 2;
 69 if(count($text3) > 1){
 70 $num_size = 3;
 71 }
 72  
 73  
 74 $size = 30;//字体大小
 75 $x=130;//第一行定位
 76 $y=($height-imagefontheight($size))/$num_size;
 77  $x2=110;//第二行定位
 78  $y2=$y+60;
 79  
 80  $x3=110;//第二行定位
 81  $y3=$y2+60;
 82  
 83   foreach ($text1 as $k => $v) {
 84             #imagettftext(参数A:背景图路径,参数B:字体大小,参数C:文字角度0标识从左到右读的文本,参数D:首个文字在背景图上的横坐标,参数E:首个文字在背景图上的纵坐标,参数F:文字的颜色值,参数G:字体库路径,参数H:需要写在图上的文字,)
 85             imagettftext($bg_image, $size, 0, $x, $y, $color, $font, $v);//在背景图上循环添加文字
 86             $x = $x + 45;//增加横坐标来做到间距的效果,没有这个参数打印出来的字会重叠在一起!
 87  } 
 88    foreach ($text2 as $k => $v) {
 89              
 90             #imagettftext(参数A:背景图路径,参数B:字体大小,参数C:文字角度0标识从左到右读的文本,参数D:首个文字在背景图上的横坐标,参数E:首个文字在背景图上的纵坐标,参数F:文字的颜色值,参数G:字体库路径,参数H:需要写在图上的文字,)
 91             imagettftext($bg_image, $size, 0, $x2, $y2, $color, $font, $v);//在背景图上循环添加文字
 92             $x2 = $x2+ 45;//增加横坐标来做到间距的效果,没有这个参数打印出来的字会重叠在一起!
 93  } 
 94  foreach ($text3 as $k => $v) {
 95              
 96             #imagettftext(参数A:背景图路径,参数B:字体大小,参数C:文字角度0标识从左到右读的文本,参数D:首个文字在背景图上的横坐标,参数E:首个文字在背景图上的纵坐标,参数F:文字的颜色值,参数G:字体库路径,参数H:需要写在图上的文字,)
 97             imagettftext($bg_image, $size, 0, $x3, $y3, $color, $font, $v);//在背景图上循环添加文字
 98             $x3 = $x3+ 45;//增加横坐标来做到间距的效果,没有这个参数打印出来的字会重叠在一起!
 99  } 
100  //判断是否存在水印
101 if($waterfont){
102 foreach ($waterfont as $k => $v) {        
103             #imagettftext(参数A:背景图路径,参数B:字体大小,参数C:文字角度0标识从左到右读的文本,参数D:首个文字在背景图上的横坐标,参数E:首个文字在背景图上的纵坐标,参数F:文字的颜色值,参数G:字体库路径,参数H:需要写在图上的文字,)
104             imagettftext($bg_image, $size, 0, $waterx, $watery, $color, $font, $v);//在背景图上循环添加文字
105             $waterx =$waterx+ 45;//增加横坐标来做到间距的效果,没有这个参数打印出来的字会重叠在一起!
106  } 
107 }
108 //保存图片
109  header("Content-type:image/png");
110  imagepng($bg_image);
111  imagedestroy($bg_image);
112 //销毁内存
113 imagedestroy($bg_image);
114 imagedestroy($tu1_image);
115 imagedestroy($tu2_image);
116 //开启缓存
117 session_start(); 
118 header("Cache-Control: private, max-age=10800, pre-check=10800");
119 header("Pragma: private");
120 header("Expires: " . date(DATE_RFC822,strtotime(" 2 day")));
121 ?>

伪静态配置:(这里根据自己的服务器类型进行选择)

 
apache的伪静态
 
RewriteRule  ^(aiimage)/(.*).png$  $1/url.php?title=$2
 
ngnix的伪静态
 
location /aiimage {
  rewrite ^/(aiimage)/(.*).png$ /$1/url.php?title=$2;
}
或者:
rewrite ^/(aiimage)/(.*).png$ /$1/url.php?title=$2;

我的是apache的所以我的伪静态配置为:

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On
  
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  
  RewriteRule  ^(.*).png$  /url.php?title=$1
</IfModule>

 

标签:文字,image,size,参数,php,背景图,imagettftext,图片
来源: https://www.cnblogs.com/sdjlq/p/15976512.html