1. 程式人生 > >php生成有二維碼的背景圖片

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);
            
        }