php生成有二维码的背景图片

这几天在做的健身房后台的时候有一个将二维码,还有名称 放置背景图上,并且要居中显示,最后生成健身房图片de功能,查找了各种资料,最后完成了属于享健身平台的每一个健身房的一个带有二维码的图片,并且将图片链接存入数据库中。
大概思路是这样的:获取二维码图片,获取背景图片,将二维码图片放置在背景图片上,然后调整X轴,Y轴的位置,最终放置在背景图上合适的位置,保存图片,然后获取图片,将健身房的名称放置在背景图的合适位置,并且水平居中。
名称居中这块要注意要获取字符盒子的左边X点和右边X点,这样才能算出居中的位置,还要注意有汉字和英文的区分,虽说一个汉字3个字符,但是有英文和汉字组合的名称的时候会有偏差,我的做法是用正则匹配有英文的,找到偏差值,将字符的长度减去偏差值,这样就会居中了,代码如下:    
   
        //获取二维码图片
        $type['qr_code']=  ROOT_PATH . 'public'.$user['qr_logocode'];
        //准备好的背景图片
        $background = ROOT_PATH.'public/static/gym/images/timg1.png';

        if ($background !== FALSE) {

            $QR = imagecreatefromstring(file_get_contents($type['qr_code']));

            $background = imagecreatefromstring(file_get_contents($background));

            $QR_width = imagesx($QR);//源图宽度 源图就是需要载入的图片

            $QR_height = imagesy($QR);//源图高度

            $logo_width = imagesx($background);//目标图宽度  目标图就是背景图

            $logo_height = imagesy($background);//目标图高度

            $logo_qr_width = $logo_width / 1.6;//缩放目标图的width

            $from_width = ($logo_width - $logo_qr_width) / 2;//目标 X 坐标点
            $from_height = $QR_height*3.6 ;//目标 Y 坐标点

            //重新组合图片并调整大小 目标图     源图   目标 X 坐标点  目标 Y 坐标点
            imagecopyresampled($background, $QR, $from_width, $from_height,
                //源的X坐标点 源的Y坐标点  目标宽度   目标高度         源图象的宽度  源图象的高度
                0, 0, $logo_qr_width, $logo_qr_width, $QR_width, $QR_height);
            $backImg = explode('/',$user['qr_logocode']);

            foreach ($backImg as &$_v){
                if(strpos($_v,'jpg')){
                    $_v = 'back_'.$_v;
                }
            }
            $backImgname = implode('/',$backImg);//给新图片命名
            //输出图片保存在文件夹中,执行成功你会发现你的文件夹中多了一个图片
            imagejpeg($background, ROOT_PATH . 'public'.$backImgname);

            //给图片添加健身房名称
            $text = $user['name'];//文字
            $strlen = strlen($text);
            if(preg_match( '/[A-Za-z]*/',$text)){
                $strlen = $strlen-20;
            }

            $font = ROOT_PATH . 'public/static/gym/fonts/PingFang Bold.ttf';//字体
            $text_x = imagettfbbox (110, $strlen , $font , $text);
            $widths=$text_x[2]-$text_x[0];//右下角X位置减去左下角X位置得到字符的宽度
            $widths=($logo_width-$widths)*0.5;//获取居中的X轴

            $image = \think\Image::open('.'.$backImgname);
            $image -> text($text,$font,110,'#ffffff',[$widths,1050])
                   ->save('.'.$backImgname);
            
        }

猜你喜欢

转载自blog.csdn.net/hechenhongbo/article/details/83577877