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);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值