0
A
回答
0
PHP函數imagettftext(...)可以編寫文本,但不支持長文本的包裝,因此您必須將文本分成單詞,並且爲每個單詞調用imagettfbbox(...)來計算單詞邊界和測試這個詞是否應該放在新的一行上。
要知道文本的總高度,爲了能夠垂直對齊文本,必須將渲染推遲到最後。
這是代碼。
DEMO USAGE
<?php
// Image params
$imgWidth = 240;
$imgHeight = 900;
// Text params
$text='Tanto va la gatta al lardo che ci lascia lo zampino!';
$drawFrame=array(10,340,$imgWidth-10,$imgHeight-140);
$fontType = 'ArialBlack.ttf';
$fontSize = 30;
$lineHeight=32;
$wordSpacing=' ';
$hAlign=0; // -1:left 0:center 1:right
$vAlign=0; // -1:top 0:middle 1:bottom
// allocate
$img = imagecreatetruecolor($imgWidth,$imgHeight);
$background = imagecolorallocate($img, 78,129,154);
$textColor = imagecolorallocate($img, 255,255,255);
// debug show text area
$area_color = imagecolorallocate($img, 255,0,0);
imagerectangle ($img, $drawFrame[0], $drawFrame[1], $drawFrame[2], $drawFrame[3], $area_color);
// write text
wrapimagettftext($img, $fontSize, $drawFrame, $textColor,$fontType, $text, '100%',' ',$hAlign,$vAlign);
// output image
header("Content-type: image/png");
imagepng($img);
imagecolordeallocate($img, $textColor);
imagecolordeallocate($img, $background);
?>
主要功能
<?php
function wrapimagettftext($img, $fontSize, $drawFrame, $textColor,$fontType, $text, $lineHeight='',$wordSpacing='',$hAlign=0,$vAlign=0) {
if($wordSpacing===' ' || $wordSpacing==='') {
$size = imagettfbbox($fontSize, 0, $fontType, ' ');
$wordSpacing=abs($size[4]-$size[0]);
}
$size = imagettfbbox($fontSize, 0, $fontType, 'Zltfgyjp');
$baseHeight=abs($size[5]-$size[1]);
$size = imagettfbbox($fontSize, 0, $fontType, 'Zltf');
$topHeight=abs($size[5]-$size[1]);
if($lineHeight==='' || $lineHeight==='') {
$lineHeight=$baseHeight*110/100;
} else if(is_string($lineHeight) && $lineHeight{strlen($lineHeight)-1}==='%') {
$lineHeight=floatVal(substr($lineHeight,0,-1));
$lineHeight=$baseHeight*$lineHeight/100;
} else {
}
$usableWidth=$drawFrame[2]-$drawFrame[0];
$usableHeight=$drawFrame[3]-$drawFrame[1];
$leftX=$drawFrame[0];
$centerX=$drawFrame[0]+$usableWidth/2;
$rightX=$drawFrame[0]+$usableWidth;
$topY=$drawFrame[1];
$centerY=$drawFrame[1]+$usableHeight/2;
$bottomY=$drawFrame[1]+$usableHeight;
$text = explode(" ", $text);
$line_w=-$wordSpacing;
$line_h=0;
$total_w=0;
$total_h=0;
$total_lines=0;
$toWrite=array();
$pendingLastLine=array();
for($i=0;$i<count($text);$i++) {
$size = imagettfbbox($fontSize, 0, $fontType, $text[$i]);
$width = abs($size[4] - $size[0]);
$height = abs($size[5] - $size[1]);
$x = -$size[0]-$width/2;
$y = $size[1]+$height/2;
if($line_w+$wordSpacing+$width>$usableWidth) {
$lastLineW=$line_w;
$lastLineH=$line_h;
if($total_w<$lastLineW) $total_w=$lastLineW;
$total_h+=$lineHeight;
foreach($pendingLastLine as $aPendingWord) {
if($hAlign<0) $tx=$leftX+$aPendingWord['tx'];
else if($hAlign>0) $tx=$rightX-$lastLineW+$aPendingWord['tx'];
else if($hAlign==0) $tx=$centerX-$lastLineW/2+$aPendingWord['tx'];
$toWrite[]=array('line'=>$total_lines,'x'=>$tx,'y'=>$total_h,'txt'=>$aPendingWord['txt']);
}
$pendingLastLine=array();
$total_lines++;
$line_w=$width;
$line_h=$height;
$pendingLastLine[]=array('tx'=>0,'w'=>$width,'h'=>$height,'x'=>$x,'y'=>$y,'txt'=>$text[$i]);
} else {
$line_w+=$wordSpacing;
$pendingLastLine[]=array('tx'=>$line_w,'h'=>$width,'w'=>$height,'x'=>$x,'y'=>$y,'txt'=>$text[$i]);
$line_w+=$width;
if($line_h<$height) $line_h=$height;
}
}
$lastLineW=$line_w;
$lastLineH=$line_h;
if($total_w<$lastLineW) $total_w=$lastLineW;
$total_h+=$lineHeight;
foreach($pendingLastLine as $aPendingWord) {
if($hAlign<0) $tx=$leftX+$aPendingWord['tx'];
else if($hAlign>0) $tx=$rightX-$lastLineW+$aPendingWord['tx'];
else if($hAlign==0) $tx=$centerX-$lastLineW/2+$aPendingWord['tx'];
$toWrite[]=array('line'=>$total_lines,'x'=>$tx,'y'=>$total_h,'txt'=>$aPendingWord['txt']);
}
$pendingLastLine=array();
$total_lines++;
$total_h+=$lineHeight-$topHeight;
foreach($toWrite as $aWord) {
$posx = $aWord['x'];
if($vAlign<0) $posy=$topY+$aWord['y'];
else if($vAlign>0) $posy=$bottomY-$total_h+$aWord['y'];
else if($vAlign==0) $posy=$centerY-$total_h/2+$aWord['y'];
imagettftext($img, $fontSize, 0, $posx, $posy , $textColor, $fontType, $aWord['txt']);
}
}
?>
相關問題
- 1. 如何使用PHP GD庫將文本添加到圖像
- 2. 如何使用GD庫將多個圖像合併在一起?
- 3. 將文本放入圖像PHP GD
- 4. GD庫使用動態文本創建圖像
- 5. 爲什麼PHP GD庫無法在磁盤上寫入圖像?
- 6. gd庫 - 圖像上的文本作爲回聲與html
- 7. 使用PHP GD定位圖像上的文本Lib
- 8. 使用php將文本寫入圖像
- 9. PHP的GD庫圖像使用BASE64_ENCODE
- 10. 使用GD庫裁剪圖像
- 11. 使用GD庫的圖像隨機化
- 12. 使用GD庫創建圖像灰度
- 13. 用於操縱圖像文本與GD
- 14. PHP gd庫,如何在現有的PNG圖像上畫線
- 15. 如何使用PHP GD放大圖像?
- 16. 將文本轉換爲圖像 - PHP/GD - 保存圖像
- 17. 如何使用PHP的GD庫在圖像上執行縫製雕刻?
- 18. 將圖像與PHP結合使用GD
- 19. 使用gd在圖像邊界內換行顯示文本
- 20. 如何使用ImageMagick將鏡像文本繪製到圖像上?
- 21. 如何使用css將文本放置在html圖像上方?
- 22. 我會如何使用GD庫歪曲圖像?
- 23. GD庫保存圖像
- 24. 如何使用gd庫或任何方法將高分辨率圖像上傳到文件夾?
- 25. 如何使用php腳本將圖像上傳到數據庫?
- 26. 如何使用Canvas或jQuery將圖像和文本放在背景圖像上?
- 27. 動態GD圖像寬度文本
- 28. 如何調整gd圖像的大小以適應寫入的文本?
- 29. 在圖像庫上繪圖文本
- 30. 如何在圖庫視圖中的圖像上添加文本