thinkphp php7.2驗證碼字體不顯示的問題

<?php
// Set the content-type
header('Content-Type: image/png');

// Create the image
$im = imagecreatetruecolor(400, 30);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);

// The text to draw
$text = 'Testing...';
// Replace path by your own font path
$font = 'arial.ttf';

// Add some shadow to the text
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);

// Add the text
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>

以官網文檔爲例,這段代碼在php7.2之前都能正常顯示。php

php7.2就不能顯示了。由於字體文件路徑的緣由,不能被正確的識別session

要麼按照官方文檔的方法php7

將當前路徑放到環境變量中,要麼使用 __DIR__ ,__FILE__,realpath函數等獲得字體的物理路徑。如函數

/**
     * 輸出驗證碼並把驗證碼的值保存的session中
     * 驗證碼保存到session的格式爲: array('verify_code' => '驗證碼值', 'verify_time' => '驗證碼建立時間');
     * @access public     
     * @param string $id 要生成驗證碼的標識   
     * @return void
     */
    public function entry($id = '') {
        // 圖片寬(px)
        $this->imageW || $this->imageW = $this->length*$this->fontSize*1.5 + $this->length*$this->fontSize/2; 
        // 圖片高(px)
        $this->imageH || $this->imageH = $this->fontSize * 2.5;
        // 創建一幅 $this->imageW x $this->imageH 的圖像
        $this->_image = imagecreate($this->imageW, $this->imageH); 
        // 設置背景      
        imagecolorallocate($this->_image, $this->bg[0], $this->bg[1], $this->bg[2]); 

        // 驗證碼字體隨機顏色
        $this->_color = imagecolorallocate($this->_image, mt_rand(1,150), mt_rand(1,150), mt_rand(1,150));
        // 驗證碼使用隨機字體
        $ttfPath = $this->_path . ($this->useZh ? 'zhttfs' : 'ttfs') . '/';

        if(empty($this->fontttf)){
            $dir = dir($ttfPath);
            $ttfs = array();		
            while (false !== ($file = $dir->read())) {
                if($file[0] != '.' && substr($file, -4) == '.ttf') {
                    $ttfs[] = $file;
                }
            }
            $dir->close();
            $this->fontttf = $ttfs[array_rand($ttfs)];
        } 
        $this->fontttf = realpath($ttfPath . $this->fontttf);//獲取字體的物理路徑

        if($this->useImgBg) {
            $this->_background();
        }
        
        if ($this->useNoise) {
            // 繪雜點
            $this->_writeNoise();
        } 
        if ($this->useCurve) {
            // 繪干擾線
            $this->_writeCurve();
        }
        
        // 繪驗證碼
        $code = array(); // 驗證碼
        $codeNX = 0; // 驗證碼第N個字符的左邊距
        if($this->useZh){ // 中文驗證碼
            for ($i = 0; $i<$this->length; $i++) {
                $code[$i] = iconv_substr($this->zhSet,floor(mt_rand(0,mb_strlen($this->zhSet,'utf-8')-1)),1,'utf-8');
                imagettftext($this->_image, $this->fontSize, mt_rand(-40, 40), $this->fontSize*($i+1)*1.5, $this->fontSize + mt_rand(10, 20), $this->_color, $this->fontttf, $code[$i]);
            }
        }else{
            for ($i = 0; $i<$this->length; $i++) {
                $code[$i] = $this->codeSet[mt_rand(0, strlen($this->codeSet)-1)];
                $codeNX  += mt_rand($this->fontSize*1.2, $this->fontSize*1.6);
                imagettftext($this->_image, $this->fontSize, mt_rand(-40, 40), $codeNX, $this->fontSize*1.6, $this->_color, $this->fontttf, $code[$i]);
            }
        }
       
        // 保存驗證碼
        $key        =   $this->authcode($this->seKey);
        $code       =   $this->authcode(strtoupper(implode('', $code)));
        $secode     =   array();
        $secode['verify_code'] = $code; // 把校驗碼保存到session
        $secode['verify_time'] = NOW_TIME;  // 驗證碼建立時間
        session($key.$id, $secode);
                        
        header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
        header('Cache-Control: post-check=0, pre-check=0', false);		
        header('Pragma: no-cache');
        header("content-type: image/png");

        // 輸出圖像
        imagepng($this->_image);
        imagedestroy($this->_image);
    }
相關文章
相關標籤/搜索