php|thinkphp程序合成图片+文字+图片大小调整+正方形转换圆角+去除白色边框

/**
 * 图片合成工具类
 * 说明:
 * 拿过来不一定可以使用,需要自行调整每一步骤的参数,
 * 处理步骤分开,调整大小--改变圆角--合成图片--添加文字
 * 比较清晰,也可以封装到一个函数里面一步处理,可以自行补充
 * 注意:字体用的微软雅黑,自行下载引入
 * 图片测试调试阶段尽可能使用网络地址路径,
 * 没有自行创建目录函数,也没有清楚废弃的图片资源,自行完善

所有处理方式来自网络收集,一下整理
 */
namespace Demo\Controller;
class ImageGenerationController  {
   
    //控制输出
    public function demo()
    {
        //改变图像大小
        $stage1 = $this->resize_image('user.png','http://www./你的图片地址', 150, 150);
        if($stage1){
            //更改头像为圆形
            $stage2 = $this->yuanjiao($stage1,'./Uploads/card/thumb/'.$v['id'].'stage2.png');
            if(!empty($stage2)){
                //合成图片
                $stage3 = $this->getimg2($stage2);
                //添加文字
                if(!empty($stage3)){
                    //array('x'=>250,'y'=>110,'fontsize'=>20,'ttf'=>'./msyh.ttf')
                    //完成
                    $stage4 = $this->addText($stage3, array($list['name'],$list['lawfirm']),array('x'=>250,'y'=>110,'fontsize'=>20));
                }
            }
        }
    }
    /**
     * 给图片添加文字
     * @param string $strImg 图片文件名
     * @param string $strText 字符串内容
     * @param array $arrOpt ['r','g','b','x','y','fontsize','angle','savepath','ttf']
     */
    public function addText($retrue_id,$strImg, $strText, $arrOpt = array()){
        $intR = isset($arrOpt['r']) ? $arrOpt['r'] : 255;
        $intG = isset($arrOpt['g']) ? $arrOpt['g'] : 255;
        $intB = isset($arrOpt['b']) ? $arrOpt['b'] : 255;
        $intX = isset($arrOpt['x']) ? $arrOpt['x'] : 24;
        $intY = isset($arrOpt['y']) ? $arrOpt['y'] : 24;
        $intSize = isset($arrOpt['fontsize']) ? $arrOpt['fontsize'] : 14;
        $intAngle = isset($arrOpt['angle']) ? $arrOpt['angle'] : 0;
        $strSave = isset($arrOpt['savepath']) ? $arrOpt['savepath'] : false;
        $strFont = isset($arrOpt['ttf']) ? $arrOpt['ttf'] : './Public/qwadmin/css/msyh.ttf';
    
        $im = imagecreatefromstring(file_get_contents($strImg));
    
        $color = imagecolorallocate($im, $intR, $intG, $intB);
        //第一行 (标题)
//         imagettftext($im, $intSize, $intAngle, $intX, $intY, $color, $strFont, '|'.$strText);
//         imagettftext($im, $intSize, $intAngle, $intX+1, $intY, $color, $strFont, '|'.$strText);
        //第二行 (姓名)
        imagettftext($im, 16, $intAngle, 250, 165, $color, $strFont, $strText[0]);
        //第三行 (律所)
        imagettftext($im, 16, $intAngle, 250, 200, $color, $strFont, $strText[1]);
        //         if (empty($strSave)) {
        //             header("Content-type: image/jpeg");
        //             imagejpeg($im);
        //         } else {
        //imagejpeg($im, $strSave);
        
        imagepng($im,'./Uploads/card/thumb/stage4.png');
        //         }
        imagedestroy($im);
    }
    /**
     * 两张图合成一张
     * @param unknown $path_1 //默认背景图
     * @param unknown $path_2
     */
    private function getimg2($path_2){
        $path_1 ='https://xxx你的背景图url地址';//一般是固定,根据业务自行调整
        $image_1 = imagecreatefrompng($path_1);
        $image_2 = imagecreatefrompng($path_2);
        //创建一个和图1相同大小的真彩色画布(ps:只有这样才能保证后面copy图片的时候不会失真)
        $image_3 = imageCreatetruecolor(imagesx($image_1),imagesy($image_1));
        //为真彩色画布创建白色背景,再设置为透明
        $color = imagecolorallocate($image_3, 1000, 1000, 1000);
        //此处3个1000可以使背景设为白色,3个255可以使背景变成透明色
        imagefill($image_3, 0, 0, $color);
        imageColorTransparent($image_3, $color);
        //首先将图1画布采样copy到真彩色画布中,不会失真
        imagecopyresampled($image_3,$image_1,0,0,0,0,imagesx($image_1),imagesy($image_1),imagesx($image_1),imagesy($image_1));
        //再将图2图片copy到已经具有图1图像的真彩色画布中,同样也不会失真
        //imagecopymerge($image_3,$image_2, 0,0,0,0,imagesx($image_2),imagesy($image_2), 100);
        return  $this->imagecopymerge_alpha($image_3,$image_2,50,70,0,0,imagesx($image_2),imagesy($image_2), 0);
    }
    /**
     * 去除png  白色描边的位置
     * @param unknown $retrue_id
     * @param unknown $dst_im
     * @param unknown $src_im
     * @param unknown $dst_x
     * @param unknown $dst_y
     * @param unknown $src_x
     * @param unknown $src_y
     * @param unknown $src_w
     * @param unknown $src_h
     * @param unknown $pct
     * @return string
     */
    private function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
        $opacity=$pct;
        $w = imagesx($src_im);
        $h = imagesy($src_im);
        $cut = imagecreatetruecolor($src_w, $src_h);
        imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
        $opacity = 100-$opacity;
        imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
        imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity);
        
        $imgpath = './Uploads/card/thumb/stage3.png';
        imagepng($dst_im,$imgpath);
        return $imgpath;
    }
    /**
     * 设置正方形头像为圆形
     * @param unknown $img  图像路径
     * @param unknown $dest_path  存储路径
     * @return unknown
     * 出入来之,博客
     */
    public function yuanjiao($img,$dest_path){
        $src = imagecreatefromstring(file_get_contents($img)); //获取网络资源文件
        $wh= getimagesize($img);
        $w=$wh[0];
        $h=$wh[1];
        $w=min($w,$h);
        $h= $w;
        $newpic = imagecreatetruecolor($w,$h);
        //建立的是一幅大小为 x和 y的黑色图像(默认为黑色),如想改变背景颜色则需要用填充颜色函数imagefill($img,0,0,$color);
        // $img = imagecreatetruecolor(100,100);    //创建真彩图像资源
        // $color = imagecolorAllocate($img,200,200,200);   //分配一个灰色
        // imagefill($img,0,0,$color);
        // 启用混色模式
        imagealphablending($newpic,false); //设定图像的混色模式
        //imagealphablending() 允许在真彩色图像上使用两种不同的绘画模式。
        // 在混色(blending)模式下,alpha 通道色彩成分提供给所有的绘画函数,例如 imagesetpixel() 决定底层的颜色应在何种程度上被允许照射透过。作为结果,GD 自动将该点现有的颜色和画笔颜色混合,并将结果储存在图像中。结果的像素是不透明的。
        // 在非混色模式下,画笔颜色连同其 alpha 通道信息一起被拷贝,替换掉目标像素。混色模式在画调色板图像时不可用。
        // 如果 blendmode 为 TRUE,则启用混色模式,否则关闭。成功时返回 TRUE, 或者在失败时返回 FALSE。
        $transparent = imagecolorallocatealpha($newpic, 255, 255, 255, 127);//边缘透明
        //imagecolorallocatealpha(resource $image , int $red , int $green , int $blue, int $alpha )
        // $image 图像资源,通过创造的图像功能,如,一返回imagecreatetruecolor()。
        // $red 红色分量的价值。
        // $green 价值的绿色成分。
        // $blue 蓝色成分的价值。
        // $alpha 一个介于0和127的价值。 0表示完全不透明,而127表示完全透明。
        $r=$w/2;
        for($x=0;$x<$w;$x++){
            for($y=0;$y<$h;$y++){
                $c = imagecolorat($src,$x,$y);
                $_x = $x - $w/2;
                $_y = $y - $h/2;
                if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){
                    imagesetpixel($newpic,$x,$y,$c);
                }else{
                    imagesetpixel($newpic,$x,$y,$transparent);
                    //imagesetpixel() 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。
                }
            }
        }
        //imagesavealpha() 设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息(与单一透明色相反)
        imagesavealpha($newpic, true);
        // header('Content-Type: image/png');
        $imgcc = imagepng($newpic, $dest_path);
        imagedestroy($newpic);
        imagedestroy($src);
        return $dest_path;
            
    }
    /**
     * 改变图片尺寸大小
     * @param unknown $filename 文件名字
     * @param unknown $tmpname  当前文件路径
     * @param unknown $xmax     最大宽度
     * @param unknown $ymax     最大高度
     * @return unknown
     */
    private function  resize_image($filename, $tmpname, $xmax, $ymax)
    {
        $ext = explode(".", $filename);
        $ext = $ext[count($ext)-1];
        $im = false;
        if($ext == "jpg" || $ext == "jpeg"){
            $im = imagecreatefromjpeg($tmpname);
            if($im == false){
                //防止命名后缀错误,与实际图片的格式不一致
                $im = imagecreatefrompng($tmpname);
            }
        }else if($ext == "png"){
            $im = imagecreatefrompng($tmpname);
            if($im == false){
                //防止命名后缀错误,与实际图片的格式不一致
                $im = imagecreatefromjpeg($tmpname);
            }
        }else if($ext == "gif"){
            $im = imagecreatefromgif($tmpname);
        }
        $x = imagesx($im);
        $y = imagesy($im);
        if($x <= $xmax && $y <= $ymax){
            return $im;
        }    
        //处理........
        if($x >= $y) {
            $newx = $xmax;
            $newy = $newx * $y / $x;
        }
        else {
            $newy = $ymax;
            $newx = $x / $y * $newy;
        }
        $im2 = imagecreatetruecolor($newx, $newy);
        imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);
        //返回当前名字
        $cc = imagepng($im2,'./Uploads/card/thumb/'.$filename);
        imagedestroy($im2);
        return './Uploads/card/thumb/'.$filename;
    }
    
}
 

在使用thinkphp框架进行图片上传时,可以通过js来实现以下步骤。 首先,需要创建一个表单,包括一个文件输入框和一个上传按钮。给文件输入框和上传按钮分别设置一个唯一的id值,便于之后通过js获取它们的元素。 接着,使用js来监听上传按钮的点击事件,当点击上传按钮时,触发上传文件的操作。可以通过getElementById方法获取文件输入框的元素,进而获取用户选择的文件对象。 然后,通过FormData对象创建一个表单数据对象,并使用append方法将文件对象添加到表单数据对象中。注意,需要为文件对象添加一个key值,方便后端通过$_FILES数组获取上传的文件。 接下来,通过XMLHttpRequest对象创建一个异步请求对象。使用open方法指定请求方法和URL,并将请求方法设置为POST。注意,这里的URL是指向thinkphp框架中上传图片的控制器方法。 然后,设置请求的header头信息,将Content-Type设置为multipart/form-data,以支持上传文件。 接着,设置请求的回调函数,当请求完成时执行相应的操作。可以在回调函数中验证返回的状态码和响应信息,以确保上传成功。 最后,调用send方法发送请求,并等待上传的过程完成。在上传过程中,可以通过onprogress事件监听上传的进度。 综上所述,通过以上步骤,使用js可以将图片上传到thinkphp框架中。在后端控制器方法中,可以通过$_FILES数组获取上传的文件,并进行相应的处理。这样就实现了js上传图片功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值