利用PHP实现文字绘制到新的图片上的功能

思想和行动 总有一个不能落后于人

虽然写出来了js实现文字和图片加载到一起生成一个新的图片的功能,但是我没有用js实现一个把生成的图片下载到本地的过程,请赌神看了看,赌神说他是用的php写的,我想既然他用php写了,我用js就不太方便获得指导啊,于是乎就顺便看了一下如何用php实现该功能。

百度了一下发现有现成的代码,所以为了方便我也就不浪费时间了,直接copy了人家的代码。

function generateImg($source, $text1, $text2, $text3, $font = './msyhbd.ttf') {
	$date = '' . date ( 'Ymd' ) . '/';
	$img = $date . md5 ( $source . $text1 . $text2 . $text3 ) . '.jpg';
	if (file_exists ( './' . $img )) {
		return $img;
	}

	$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 );

	$fontSize = 18;//磅值字体
	$fontColor = imagecolorallocate ( $target, 255, 0, 0 );//字的RGB颜色
	$fontBox = imagettfbbox($fontSize, 0, $font, $text1);//文字水平居中实质
	imagettftext ( $target, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), 190, $fontColor, $font, $text1 );

	$fontBox = imagettfbbox($fontSize, 0, $font, $text2);
	imagettftext ( $target, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), 370, $fontColor, $font, $text2 );

	$fontBox = imagettfbbox($fontSize, 0, $font, $text3);
	imagettftext ( $target, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), 560, $fontColor, $font, $text3 );

	//imageantialias($target, true);//抗锯齿,有些PHP版本有问题,谨慎使用

	imagefilledpolygon ( $target, array (10 + 0, 0 + 142, 0, 12 + 142, 20 + 0, 12 + 142), 3, $fontColor );//画三角形
	imageline($target, 100, 200, 20, 142, $fontColor);//画线
	imagefilledrectangle ( $target, 50, 100, 250, 150, $fontColor );//画矩形

	//bof of 合成图片
	$child1 = imagecreatefromjpeg ( 'http://gtms01.alicdn.com/tps/i1/T1N0pxFEhaXXXxK1nM-357-88.jpg' );
	imagecopymerge ( $target, $child1, 0, 400, 0, 0, imagesx ( $child1 ), imagesy ( $child1 ), 100 );
	//eof of 合成图片

	@mkdir ( './' . $date );
	imagejpeg ( $target, './' . $img, 95 );

	imagedestroy ( $main );
	imagedestroy ( $target );
	imagedestroy ( $child1 );
	return $img;
}
//http://my.oschina.net/cart/
generateImg ( 'http://1.popular.sinaapp.com/munv/pic.jpg', 'my.oschina.net/cart', 'PHP文字水平居中', '3个字' );
exit ();

简单的介绍一下这个代码;

$main = imagecreatefromjpeg ( $source );//imagecreatefromjpeg() 返回一图像标识符,代表了从给定的文件名取得的图像。所以就是从source取得图像

$width = imagesx ( $main );
$height = imagesy ( $main ); //这是可以获得取得图像的高和宽 其实 也可以自己设定一个值 这取决于你想要的最终的图像的宽高

$target = imagecreatetruecolor($width,$height); imagecreatetruecolor 新建了一个黑色的图像 可以设置宽和高

$white = imagecolorallocate($target,255,255,255);

imagefill($target,0,0,$white);这是给target这个图像背景色调为白色。

imagecopyresample($target,$main,0,0,0,0,$width,$height,$width,$heigh);//重新采样拷贝部分图像并调整大小

$fontSize = 18; //这个fontSize是到时候用imagettfobbox的时候会用到的。已经判断居中的时候会用到

$fontColor = imagecolorallocate($target,255,0,0);

$fontBox = imagettfbbox($fontSize,0,$font,$text1);

imagettftext($target ,$fontSize,0,ceil(($width – $fontBox[2])/2),190,$fontColor,$text1);

重点分析一下下面几个函数imagettfbox 和imagettftext

关于imagettfbox

imagettfbox ——取得使用TrueType字体的文本范围 简单查了一下 TrueType字体是非常常见的字体格式,一般用的ttf和ttc就属于TrueType字体的范畴。

imagettfbbox($size,$angle,$fontfile,$text)第一个传入的值是size 特质像素角度的大小,第二个传入的值角度,顺时针计算,0的时候为三点钟中方向,第三个传入的值是字体的文件名,可以是URL,第四个text是要传入的字符串。

imagegettfbox()返回一个含有8个单元的数组表示了文本外框的四个角: 这些点是相对于文本 而和角度无关,因此左上角指的是以水平方向看文字时其左上角。

0  左下角X位置

1  左下角Y位置

2  右下角X位置

3  右下角Y位置

4  右上角X位置

5  右上角Y位置

6  左上角X位置

7  左上角Y位置

——————————————————————————————————————————————————————————————————————————————

测试部分待添加。。。。。。。目前他说这个

——————————————————————————————————————————————————————————————————————————————

 关于imagegettftext的使用方法,这是一个向图片中写入文字的方法,

《利用PHP实现文字绘制到新的图片上的功能》

一共有八个参数,缺一不可,

imagettftext($image,$size,$angle,$x,$y,$color,$fontfile,$text);

1)$image 这个是画布资源 也就是即将要填充文字的图片

2)$size  字体大小,其长度依赖与GD库的版本,对于GD1来说是像素,对于GD2来说是磅值,现在一般都是GD2了,所以运用的就是磅值。

磅值是一个长度单位,把一英寸分成72份,每一份就是1磅。磅值是一个绝对的物理单位。而像素没有固定大小,而是与分辨率有关。高分辨率的显示器像素就很小。

3) $angle 是旋转角度  角度的单位是度,而不是弧度,旋转的中心点就是参数$x,$y。

4)

5) $x ,$y被绘制字符串的第一个字符的基线点,单位是像素。这里涉及到字体设计的基本知识–基线,这个点绝对不是左上角,而具体是什么取决于所使用的字体是如何设计的。对于宋体、楷体、黑体等常见的字体中的汉子,这个点大概位于字体的左下部分;而对于英文字母和标点符号,则各部相同。如下图:

《利用PHP实现文字绘制到新的图片上的功能》《利用PHP实现文字绘制到新的图片上的功能》《利用PHP实现文字绘制到新的图片上的功能》《利用PHP实现文字绘制到新的图片上的功能》《利用PHP实现文字绘制到新的图片上的功能》

  

6)$color 字体的颜色 

7)$fontfile 字体文件 也就是包含TrueType字体的文件,如楷体simkai.ttf。这种文件格式是有标准规范的,而且与平台无关。所以可以直接把Window系统的字体文件拷贝到Linux下面使用。

8)$text 要渲染的字符串,需要注意必需是UTF-8编码的字符串。说道字符串不得不提到PHP的string数据类型。虽然名为string,其实PHP语言本身并不认识各种字符编码,他只是简单的把string看做是动态增长的”字节“数组,例如strlen()就是返回的字节数。而我们知道除了ASCLL编码的字符和字节是相同的外,几乎没有其他字符编码中的字符对应一个字节,例如一个汉子的UTF-8编码占用3个字节。至于怎么解释其中字符编码,需要专门的库函数如iconv_srtlen()。如果字符串使用的字面量,那么其所在的PHP源文件就必须编码为UTF-8存储。

关于该函数的几个小技巧

1)字处理软件的复杂之处

尽管这个函数可以显示字符串,但是针对与字处理软件(如word)来说,并不能使用。因为一旦设计到对其的问题,此函数即不能使用了。因为他不能处理字间距,当然也无法实现分散对齐的功能,再加上每一行的”避首尾“(如,不能位于行首)要求,做好字处理并不简单。

变通的方式是,首先通过复杂的公式计算出各个字符的准确位置,然后针对每一个字符调用此函数。

2)如何显示加粗字体

对于本身几劝粗体的字体文件来说,这不存在任何问题,只要使用粗体文件就可以了。问题是很多字体文件没有针对粗体单独设计。GD库中也没一个能够加粗显示的函数。其解决方法说出来有点可笑,就是针对每个字符绘制两次。第二次绘制的是的$x比第一次$x多一个像素即可。

——————————————————————————————————————————————————————————————————————————————

imagejpeg($target,’./’.$img,95);

imagejpeg()从image图像以filename为文件名创建一个JPEG图像。可以依靠这个函数把上面生成的新图像保存起来。

参数 image 返回的资源图像  filename 文件保存路径,如果未设置,或者为NULL,将会直接输出原始图像流。如果人吕这个参数而提供quality参数,使用null。

quality

quality为可选项,范围从0(最差质量,文件更小)到100(最佳质量,文件最大)。默认为IJG默认的质量大约为75.

补充一下 关于图片合成图片的问题

//bof of 合成图片

$child1 = imagecreatefromjpeg ( ‘http://gtms01.alicdn.com/tps/i1/T1N0pxFEhaXXXxK1nM-357-88.jpg’ );

imagecopymerge ( $target, $child1, 0, 400, 0, 0, imagesx ( $child1 ), imagesy ( $child1 ), 100 );

//eof of 合成图片

在合成图片之前首先你得引用到”GD库可以操作的标志“,也就是你要能够读取图片的所有信息,这时候通过imagecreatefromjpeg就可以有给定的文件名或者url创建一个新的图像,值得注意的是后面的fromjpeg,也就是说不同的操作图片格式,可能还要使用不同的代码。

简单搜索了一下,的确发现了不同格式下操作办法。所以说这里设计到一些问题,比如我要批量操作一批图片,给他们加上水印,而这些图片存在多种格式,那么怎么来处理,是通过判断图片格式,来选择操作方法,还是通过将一批图片都转换成某一种格式?或者有一种其他方法,可以实现无论格式都可以返回的办法。

imagecopymerge这个函数,可以实现将图片和图片重叠组合的办法。拷贝并并图像的一部分

imagecopymerge($dst_im,$src_im,$dst_x,$dst_y,$src_x,$src_y,$src_w,$src_h,$pct);

将src_im图像中的坐标从src_x,src_y开始,宽度为src_w,高度为src_h的一部分拷贝到dst_im图像中坐标为dst_x和dst_y的位置上,两图像将根据pct来决定合并程度,其值范围从0到100。当pct=0时,实际上什么也没做,当为100时对于调色板图像本函数和imagecopy()完全一样,它对真彩图像实现了alpha透明。

简单的来说就是将SRC_im图像加载到了DST图像中了,然后在pct设置透明度,100的时候就是不透明,完全覆盖。0的时候就是全透明,

所以PHP中通过上面这段代码可以实现一个在图片中增加文字

步骤1、读取图片 可以使用imagecreatefrom

步骤2、设置文字,设置字体,大小,颜色(颜色要通过imagecolorallocate来设置),同时位置效果可能要使用到imagegettfbox这个方法来获得字符串的像素值,将文字填充用到imagettftext函数。

步骤3、添加图片首先要读取图片,然后使用imagecopymerge函数。

步骤四 将合成后的图片输出要用到imagejpeg来输出图片

步骤五:最后合成图片后要将与image关联的内存消除。

    原文作者:相惜恨离
    原文地址: https://blog.csdn.net/g5g5t9/article/details/53182896
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞