原生php实现,图层合并,通过文字生成图片,

需求:最近在做一个原生的php项目,要通过用户上传的图片和信息,生成一个对应的证件,就想到了使用GD库,但是现在的是自己不太会,所以靠百度,找到了一个大佬写的代码,然后封装了一下,实现了此效果,留下记录,以后可以直接拿来使用,
php代码
<?php

class ImageHandle
{
    private $tmpdir = ".";
    # 文件目录必须的是绝对路径,但是后来没用上 我就先保留了
    private $font = array("family" => "E:/phpstudy_pro/WWW/php7/simkai.ttf", "color" => array(255, 0, 0), "size" => 22 );
    private $color = [255,0,255];
    private $size = 18;

    # 生成目录
    public function SetTmpDir($tmpdir = "."){
        $this->tmpdir = $tmpdir;
    }

    # 设置文字
    public function SetFont($font){
        foreach ($this->font as $key => $value) {
            if(array_key_exists($key, $font)){
                $this->font[$key] = $font[$key];
            }
        }
    }

    # 生成文件的内容大小
    public function ImageToWidthHeight($image, $width, $height){
        $imageinfo = getimagesize($image); //  获取图像大小
        $former = null;
        switch (end($imageinfo)) { // 执行最后的一个单元 来判断当前的后缀名是什么
            case 'image/jpeg':
                $former = imagecreatefromjpeg($image); // 生成一个jpg的图片
                break;
            case 'image/png':
                $former = imagecreatefrompng($image); // 生成一个png的图片
                break;
            default: break;
        }
        if($former){
            $new = imagecreatetruecolor($width, $height); // 创建一个画布资源
            imagecopyresampled($new, $former, 0, 0, 0, 0, $width, $height, imagesx($former), imagesy($former));
            $tpath = $this->tmpdir.DIRECTORY_SEPARATOR.md5(time()."".mt_rand()).image_type_to_extension(IMAGETYPE_JPEG);
            imagejpeg($new, $tpath, 100); // 生成一个图片文件,
            imagedestroy($new); // 关闭刚刚创建处理的画布资源
            imagedestroy($former);
            return $tpath;
        }
        return "";
    }

    # 合并图像
    public function MergeTwoJpegImage($image1, $image2, $x, $y){
        $base = imagecreatefromjpeg($image1); // 创建一个画布jpeg资源
        $go = imagecreatefromjpeg($image2);// 创建一个画布jpeg资源
        $gox = imagesx($go);
        $goy = imagesy($go);

        # 合并图像
        imagecopymerge($base, $go, $x, $y, 0, 0, $gox, $goy, 100);
        $tpath = $this->tmpdir.DIRECTORY_SEPARATOR.md5(time()."".mt_rand()).image_type_to_extension(IMAGETYPE_JPEG);
        imagejpeg($base, $tpath, 100);
        imagedestroy($base);
        imagedestroy($go);
        return $tpath;
    }

    # 生成最后定准的图片
    public function ImageAddText($image, $text, $x = 0, $y = 0, $textAlign = 0){

        $base = imagecreatefromjpeg($image);
        $color = imagecolorallocate($base, $this->color[0], $this->color[1], $this->color[2]);
        if($textAlign == 2){
            // 右对齐 $x 为距离$image 的右侧距离
            # 可以使用这种方法,但是我这里是由于 需要排版所以是 每个文字都要单独调整
            $fontbox = imageftbbox($this->font['size'], 0, $this->font['family'], $text);
            imagettftext($base, $this->font['size'], 0, ceil(imagesx($base) - $x - $fontbox[2]), $y, $color, $this->font['family'], $text);
        }else if($textAlign == 1){
            # 整合信息 根据坐标 进行排版
            imagestring($base, 5, 0, 0, "Hello world!", $color);
            imagestring($base, 5, 100, 250, "Hello Testt!", $color);
        }else{
            // 左对齐
            imagettftext($base, $this->font['size'], 0, $x, $y, $color, $this->font['family'], $text);
        }
        $tpath = $this->tmpdir.DIRECTORY_SEPARATOR.md5(time()."".mt_rand()).image_type_to_extension(IMAGETYPE_JPEG);
        imagejpeg($base, $tpath, 100);
        imagedestroy($base);
        return $tpath;
    }
}

# 封装函数调调用这个方法,其实可以写到方法里,在整合到php原生项目中,我是这么处理的。
function heChengHaiBao($beijing, $touxiang, $nicheng){
    $ih = new ImageHandle();
    $ih->SetTmpDir("./im"); //图片生成目录
    $ih->SetFont(array("color"=>array(255,255,255),"size"=>20));
    $bj = $ih->ImageToWidthHeight($beijing, 500, 300); // 生成文件并删除当前的文件,为最后的合并做准备
    $tx = $ih->ImageToWidthHeight($touxiang, 200, 200);// 生成文件并删除当前的文件,为最后的合并做准备

    $tmp1 = $ih->MergeTwoJpegImage($bj, $tx, 30, 30); // x y 表示距离图层的的坐标中
    $tmp5 = $ih->ImageAddText($tmp1, $nicheng, 0, 150, 1); #这个方法 是将文字写入到图层中。

    # 删除合并的 无用图片
    @unlink($bj);
    @unlink($tx);
    @unlink($tmp1);
    return $tmp5;
}

# 调用这个方法,在当前目录即可,$font是传递的文字,当前再试 使用死的方式,到时候 可以直接传递
heChengHaiBao("./test.jpg", "./one.jpg", $font);

?>
需要实时学习,切不可妄自骄傲自满,昨天遇见的需求,然后明白了一个道理,其实代码不是很难写的,主要是你要首先知道你的逻辑是同的,你想要的实现的是什么东西,想起我们老板给我说过一段话, 写代码,首先要先写伪代码, 这步是要做什么,下一步是要做什么,这一步是为了下一步要做成什么。刚开始的时候还是有点不太理解,或者有点自大。但是现在发现,经验不是白长的,更何况你先在还只是刚回爬的小孩子儿,好好学习,现在这个状态还是比较满足的,凡事能让自己上瘾的,首先就直接干到他,比如游戏,直接卸载,比如看得小说,直接卸载,昨天看小说看到了3点,有个终结的地方,直接不看了,当时就把小说软件给卸载了。单由于昨天的熬夜,今天办公就不是很有精神。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值