1. 程式人生 > >PHP實現在圖片中寫入多種字串

PHP實現在圖片中寫入多種字串

 1.ImageWriteStr類檔案

/**
 * PHP實現在圖片中寫入字串
 * Class ImageWriteStr
 * @package frontend\controllers
 */
class ImageWriteStr {

    /**
     * 預設配置引數
     * @var array
     */
    public $config = [
        // 日期及時間樣式  預設白色
        'dateStyle' => [
            'color' => [
                'r' => 255,
                'g' => 255,
                'b' => 255,
            ],
            'timeSize' => 28,
            'tX' => 130, //開始寫入字串的座標
            'tY' => 530,
            'weekSize' => 38,
            'wX' => 130,
            'wY' => 420,
        ],
        // 標題顏色  預設黑色
        'titleStyle' => [
            'color' => [
                'r' => 0,
                'g' => 0,
                'b' => 0,
            ],
            'size' => 50,
            'x' => 130,
            'y' => 700,
        ],
        // 內容顏色  預設灰色
        'contentStyle' => [
            'color' => [
                'r' => 105,
                'g' => 105,
                'b' => 105,
            ],
            'size' => 30,
            'x' => 130,
            'y' => 800, //預設值 不需要修改
        ]
    ];

    /**
     * 載入自定義配置
     * ImageWriteStr constructor.
     * @param $config
     */
    public function __construct($config)
    {
        if(empty($config['file'])){
            echo '請設定圖片路徑';exit;
        }
        if(empty($config['strTtf'])){
            echo '請設定字型路徑';exit;
        }
        if(empty($config['newFile'])){
            echo '請設定圖片儲存路徑';exit;
        }
        $this->config['newFile'] = $config['newFile'];
        $this->config['imageFile'] = $config['file'];
        $this->config['strTtf'] = $config['strTtf'];
        $imageInfo = getimagesize($config['file']);
//        array(
//            0=>1125,
//            1=>2436,
//            2=>2,
//            3=>"width=1125 height=2436",
//            ["bits"]=>8,
//            ["channels"]=>3,
//            ["mime"]=>"image/jpeg",
//        );


        $imageName = pathinfo($config['file']);
//        array(
//            ["dirname"]=>".",
//            ["basename"]=>"news.jpg",
//            ["extension"]=>"jpg",
//            ["filename"]=>"news"
//        );

        $this->config['imageWidth'] = $imageInfo[0];
        $this->config['imageHeight'] = $imageInfo[1];
        $this->config['imageName'] = $imageName['filename'];
        $this->config['imageExtension'] = $imageName['extension'];
    }

    /**
     * 進行寫入字串
     * @param array $arr week=>星期 time=>日期 title標題 content=>內容
     * @param bool $preview 是否預覽 預設為是
     */
    public function writeStr($arr = ['week'=>'','time'=>'','title'=>'','content'=>''],$preview = true)
    {
        //開啟指定的圖片檔案
        $im = imagecreatefromjpeg($this->config['imageFile']);
        //設定星期及日期字型顏色
        $dateColor = imagecolorallocatealpha($im,$this->config['dateStyle']['color']['r'], $this->config['dateStyle']['color']['g'], $this->config['dateStyle']['color']['b'], 0);
        //設定標題字型顏色
        $titleColor = imagecolorallocatealpha($im,$this->config['titleStyle']['color']['r'], $this->config['titleStyle']['color']['g'], $this->config['titleStyle']['color']['b'], 0);
        //設定內容字型顏色
        $contentColor = imagecolorallocatealpha($im,$this->config['contentStyle']['color']['r'], $this->config['contentStyle']['color']['g'], $this->config['contentStyle']['color']['b'], 0);

        //自動換行處理
        $weekArr = $this->str($this->config['dateStyle']['weekSize'] , $arr['week']);
        $timeArr = $this->str($this->config['dateStyle']['timeSize'] , $arr['time']);
        $titleArr = $this->str($this->config['titleStyle']['size'] , $arr['title']);
        $contentArr = $this->str($this->config['contentStyle']['size'] , $arr['content']);

        //星期
        imagettftext($im, $this->config['dateStyle']['weekSize'], 0, $this->config['dateStyle']['wX'], $this->config['dateStyle']['wY'], $dateColor, $this->config['strTtf'], $weekArr['content']);

        //日期
        imagettftext($im, $this->config['dateStyle']['timeSize'], 0, $this->config['dateStyle']['tX'], $this->config['dateStyle']['tY'], $dateColor, $this->config['strTtf'], $timeArr['content']);

        //標題
        imagettftext($im, $this->config['titleStyle']['size'], 0, $this->config['titleStyle']['x'], $this->config['titleStyle']['y'], $titleColor, $this->config['strTtf'], $titleArr['content']);

        //內容
        imagettftext($im, $this->config['contentStyle']['size'], 0, $this->config['contentStyle']['x'], $this->config['contentStyle']['y'] + $titleArr['line'] * 100, $contentColor, $this->config['strTtf'], $contentArr['content']);

        //是否預覽
        if($preview){
            header("content-type:image/png");
            imagepng($im);
            imagedestroy($im);
        }else{
            imagepng($im,$this->config['newFile'].$this->config['imageName'].time().'.'.$this->config['imageExtension']);
            imagedestroy($im);
        }

    }

    /**
     * 字串自動換行
     * @param $size 字串字型大小
     * @param $str 字串
     * @return array content=>處理後的字串 line=>行數
     */
    private function str($size , $str)
    {
        $content = "";
        $line = 0;
        //將字串拆分成一個個單字
        for ($i=0;$i<mb_strlen($str);$i++) {
            $strArr[] = mb_substr($str, $i, 1);
        }

        foreach ($strArr as $v) {
            $newStr = $content.$v;
            $box = imagettfbbox($size , 0, $this->config['strTtf'], $newStr);
            // 判斷拼接後的字串是否超過預設的寬度  圖片寬度-240為一行文字的寬度
            if (($box[2] > $this->config['imageWidth'] - 240) && ($content !== "")) {
                $content .= "\n";
                $line += 1;
            }
            $content .= $v;
        }

        return ['content'=>$content,'line'=>$line];
    }
}

2.demo檔案

require './ImageWriteStr.php';

$data = [
    'id'=>1,
    'title'=>'行情 | 某賬戶今日轉移',
    'content'=>'據Searchain.io監測,0x97打頭的ETH地址在9月24日收到49999ETH後,今日發生一萬枚ETH的轉移,通過其在幣安的0xc0打頭的入金地址歸集進入幣安0x87打頭的地址。該筆資金來源於此前監測到的ETH創始交易巨鯨地址0x7d04d2edc058a1afc761d9c99ae4fc5c85d4c8a6。目前,該巨鯨地址還剩5.4萬4ETH結餘。',
    'time'=>1537947503
];

$weeks = array('星期日','星期一','星期二','星期三','星期四','星期五','星期六');

$week = $weeks[date('w', $data['time'])];

$date = date('Y-m-d  H:i', $data['time']);

//        echo $week; echo $date; exit;

$ImageWriteStr = new ImageWriteStr([
    'file' => './news.jpg',
    'strTtf' => './weiruanyahei.ttf', //相對路徑報錯就用絕對路徑
    'newFile' => './',
]);

//字串加入\n可以強制換行
$ImageWriteStr->writeStr([
    'week' => $week,
    'time' => $date,
    'title' => $data['title'],
    'content' => $data['content'],
],true);

3.其他檔案地址

碼雲地址