PHP實現在圖片中寫入多種字串
阿新 • • 發佈:2018-12-12
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);