php 合成图片,生成水印,文字。

相关image函数:

1、载入图像
imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像,成功返回图像资源,失败则返回一个空字符串。
该系列函数有:
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
imagecreatefromwbmp():创建一块画布,并从 WBMP 文件或 URL 地址载入一副图像
imagecreatefromstring():创建一块画布,并从字符串中的图像流新建一副图像
语法:
resource imagecreatefromgif( string filename )
resource imagecreatefromjpeg( string filename )
resource imagecreatefrompng( string filename )
resource imagecreatefromwbmp( string filename )

resource imagecreatefromstring( string image )

 

2、imagecopymerge()
imagecopymerge() 函数用于拷贝并合并图像的一部分,成功返回 TRUE ,否则返回 FALSE 。
语法:
bool imagecopymerge( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y,
 int src_w, int src_h, int pct )
参数说明:
参数 说明
dst_im 目标图像
src_im 被拷贝的源图像
dst_x 目标图像开始 x 坐标
dst_y 目标图像开始 y 坐标,x,y同为 0 则从左上角开始
src_x 拷贝图像开始 x 坐标
src_y 拷贝图像开始 y 坐标,x,y同为 0 则从左上角开始拷贝
src_w (从 src_x 开始)拷贝的宽度
src_h (从 src_y 开始)拷贝的高度
pct 图像合并程度,取值 0-100 ,当 pct=0 时,实际上什么也没做,反之完全合并。

当为 pct = 100 时对于调色板图像本函数和 imagecopy() 完全一样

 

3、imagecolorallocatealpha — 为一幅图像分配颜色和透明度。
语法
int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )
imagecolorallocatealpha() 的行为和 imagecolorallocate() 相同,但多了一个额外的透明度参数 alpha,其值从 0 到 127。0 表示完全不透明,127 表示完全透明。
如果分配失败则返回 FALSE。

注意:此函数需要 GD 2.0.1 或更高版本(推荐 2.0.28 及更高版本)。

 

4、PHP 获取图像宽度函数:imagesx()
imagesx() 函数用于获取图像的宽度,单位为像素,返回值为整型。
语法:
int imagesx( resource image )
参数 image 为如 imagecreatetruecolor()、imagecreatefromjpeg() 等函数返回的图像资源。
PHP 获取图像高度函数:imagesy()
imagesy() 函数用于获取图像的高度,语法及用法同 imagesx() 。
语法:
int imagesy( resource image )
参数 image 为如 imagecreatetruecolor()、imagecreatefromjpeg() 等函数返回的图像资源。
实例
<?php
$img = imagecreatefrompng("runoob-logo.png");
echo "图像宽度:",imagesx( $img ),"<br />";
echo "图像高度:",imagesy( $img );

?>

 

5、hp中imagettftext()函数的使用: 用php实现在一张底图上写文字,共有8个参数,缺一不可:
(1)$image 这个是画布资源,无需再解释;
(2)$size,官方文档的解释是,字体大小,其长度单位依赖于GD库的版本,对于GD1来说是像素,
    对于GD2来说是磅(point)。现在一般都是GD2了,那么这个磅究竟是什么意思呢?这涉及到字体设计的基本知识。
 (3)$angle是旋转角度。这个官网解释的比较清楚,需要说明有两点:一是角度单位是度而不是弧度,二是旋转的中心点就是参数$x,$y。
  (4)$x,$y 被绘制字符串的第一个字符的基线点。单位是像素。这里涉及到字体设计的基本知识–基线。这个点绝对不是左上角,而具体是什么取决于所使用的字体是如何设计的。对于宋体、楷体、黑体等常见的字体中的汉字,这个点大概位于字体的左下部分;而对于英文字母和标点符号,则各不相同。如下图:
  (5)$color 字体的颜色。
  (6)$fontfile 字体文件。也就是包含trueType字体字模的文件,如楷体字体文件simkai.ttf。这种文件的格式是有标准规范的,而且与平台无关。所以可以直接把Windows系统的字体文件拷贝到Linux下使用。

  (7)$text 要渲染的字符串。需要注意必须是UTF-8编码的字符串。

 

6、PHP 输出图像
PHP 允许将图像以不同格式输出:
imagegif():以 GIF 格式将图像输出到浏览器或文件
imagejpeg():以 JPEG 格式将图像输出到浏览器或文件
imagepng():以 PNG 格式将图像输出到浏览器或文件
imagewbmp():以 WBMP 格式将图像输出到浏览器或文件
语法:
bool imagegif ( resource image [, string filename] )
bool imagejpeg ( resource image [, string filename [, int quality]] )
bool imagepng ( resource image [, string filename] )
bool imagewbmp ( resource image [, string filename [, int foreground]] )
参数说明:
image 欲输出的图像资源,如 imagecreate() 或 imagecreatefrom 系列函数的返回值
filename 可选,指定输出图像的文件名。如果省略,则原始图像流将被直接输出。
quality 可选,指定图像质量,范围从 0(最差质量,文件最小)到 100(最佳质量,文件最大),默认75 ,imagejpeg() 独有参数

foreground 可选,指定前景色,默认前景色是黑色,imagewbmp() 独有参数

小案例:

一、所需合成图片在本地

后台控制器:只需返回合成图片存储路径给前台页面就好。

 

public function agent(Request $request)
{// 合成图片存放路径$dira="public/uploads/accredit/";//存放文件夹if (! file_exists ( $dira )) {mkdir ( "$dira", 0777, true );}$path  =  $dira.'a.png';// 背景图$path_1  =  'public/static/home/images/accredit.png';// 头像图$path_2  = 'public/static/home/images/avatar.png';
                    //判断图片格式$ext= strrchr($pp,'.');//.jpeg  .png  .gif  .wbmp// 按照原图的比例生成一个最大为60*60的缩略图并保存$dirv="public/uploads/avatar/";  //头像缩略图存放文件夹if (! file_exists ( $dirv )) {mkdir ( "$dirv", 0777, true );}require(ROOT_PATH.'/vendor/topthink/think-image/src/Image.php');require(ROOT_PATH.'/vendor/topthink/think-image/src/image/Exception.php');$image = \think\Image::open($path_2 );$path_3 = $image->thumb(60,60,Image::THUMB_CENTER)->save($dirv.$random.'tou'.'.jpg');if($path_3){$path_4=$dirv.$random.'tou'.'.jpg';}//  创建图片对象$image_1 = imagecreatefrompng($path_1);// 背景图// 头像缩略图if($ext=='.png'|| $ext=='.PNG'){$image_2 = imagecreatefrompng($path_4);}if($ext=='.gif'|| $ext=='.GIF'){$image_2 = imagecreatefromgif($path_4);}if($ext=='.jpg'|| $ext=='.jpeg'||$ext=='.JPG'||$ext=='.JPEG'){$image_2 = imagecreatefromjpeg($path_4);}if($ext=='.wbmp'||$ext=='.WBMP'){$image_2 = imagecreatefromwbmp($path_4);}// 合成图片//imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $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 透明。imagecopymerge($image_1, $image_2, imagesx($image_1) / 2.35, imagesy($image_1) / 3.4, 0, 0, 60 , 60, 100);// 引入字体$font = 'public/static/home/fonts/simsun.ttc';$bloder = 'public/static/home/fonts/bolder.ttf';// 水印颜色和透明度$t_color1 = imagecolorallocatealpha($image_1, 190, 190, 190, 50);//最后一个参数值越大越透明// 水印循环for ($i = 1; $i < 100; $i = $i + 5) {$x = $i * 30;for ($k = 1; $k <100; $k = $k + 5 ){$y = $k * 27;imagefttext($image_1, 15, -45, $x, $y, $t_color1, $font, $res['name']);}}// 姓名、微信号、生份证、手机号、授权编号、授权有效期 颜色和透明度$t_color2 = imagecolorallocatealpha($image_1, 255, 248, 185, 0);//最后一个参数值越大越透明// 姓名imagefttext($image_1, 15, 0, 170, 284, $t_color2, $font, '姓名');// 微信号imagefttext($image_1, 17, 0, 170, 321, $t_color2, $font,  '微信号');// 生份证$card=substr_replace('生份证号','******',-6);imagefttext($image_1, 16, 0, 170, 357, $t_color2, $font,  $card);// 手机号imagefttext($image_1, 16, 0, 170, 395, $t_color2, $font,  '手机号');//判断是否合成成功if(imagepng($image_1, $path)){//图片保存权限  可读可写可执行chmod($path,0777);// 删除所生成缩略图unlink($path_4);}//把路径返回给前台页面
              $this->assign('path',$path);   

                               return  $this->fetch();

}

二、如果所需图片在线上,合成之前先下载到本地再进行合成。

Down:
class Down extends Controller
{public function downloadImage($url, $path='public/uploads/download/'){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);$file = curl_exec($ch);curl_close($ch);$re= $this->saveAsImage($url, $file, $path);return $re;}private function saveAsImage($url, $file, $path){$filename = pathinfo($url, PATHINFO_BASENAME);$resource = fopen($path . $filename, 'a');fwrite($resource, $file);fclose($resource);return $filename;}
}
在控制器的方法里面,在合成之前调用。

如:

$down=new Down();
$pp=$down->downloadImage($path_2);

Published by

风君子

独自遨游何稽首 揭天掀地慰生平