當前位置: 首頁> 最新文章列表> imagesetstyle 函數是什麼?如何在PHP 中正確使用它?

imagesetstyle 函數是什麼?如何在PHP 中正確使用它?

gitbox 2025-09-26

概述

imagesetstyle()是PHP 的GD 擴展提供的一個函數,用於為線條繪製設置“樣式”(即像素序列),這樣在調用imageline()imagepolygon()等繪圖函數時可以使用預定義的點劃線、虛線或其他復雜線型。使用該函數後,在繪線時傳入特殊顏色常量IMG_COLOR_STYLED (或與畫刷結合使用的IMG_COLOR_STYLEDBRUSHED )即可按樣式繪製線條。 PHP +1

函數簽名

<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">imagesetstyle</span></span><span> ( GdImage|resource </span><span><span class="hljs-variable">$image</span></span><span> , </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$style</span></span><span> )
</span></span>

工作原理(直觀理解)

$style看成一串“像素模式”,例如[red, red, red, white, white] 。當你在繪製線條並使用特殊顏色IMG_COLOR_STYLED時,GD 會沿線按順序循環讀取這串像素,遇到顏色值就繪出對應像素,遇到透明值則跳過,從而形成短劃線、點線等效果。樣式數組越長、組合越複雜,可以創造的線型也越多。 TECFA

常見常量(需了解)

  • IMG_COLOR_STYLED :在imageline()等函數中作為顏色參數使用,表示使用當前樣式數組繪製線條。

  • IMG_COLOR_BRUSHED / IMG_COLOR_STYLEDBRUSHED :與畫刷(brush)結合使用的特殊顏色常量(可用於更複雜的繪製場景)。

  • IMG_COLOR_TRANSPARENT :樣式數組中表示透明像素。
    這些常量在PHP 的圖像/GD 常量表中有說明。 PHP

基本示例:繪製虛線(完整示例,可直接運行)

下面的示例演示如何創建畫布、定義樣式並用imageline()繪製一條對角虛線,然後將圖片輸出為PNG 文件(或瀏覽器直接顯示):

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 頭部(如果在瀏覽器中直接輸出圖片)</span></span><span>
</span><span><span class="hljs-comment">// header('Content-Type: image/png');</span></span><span>

</span><span><span class="hljs-comment">// 創建畫布</span></span><span>
</span><span><span class="hljs-variable">$w</span></span><span> = </span><span><span class="hljs-number">300</span></span><span>;
</span><span><span class="hljs-variable">$h</span></span><span> = </span><span><span class="hljs-number">200</span></span><span>;
</span><span><span class="hljs-variable">$im</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatetruecolor</span></span><span>(</span><span><span class="hljs-variable">$w</span></span><span>, </span><span><span class="hljs-variable">$h</span></span><span>);

</span><span><span class="hljs-comment">// 顏色分配</span></span><span>
</span><span><span class="hljs-variable">$white</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>);
</span><span><span class="hljs-variable">$black</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-variable">$red</span></span><span>   = </span><span><span class="hljs-title function_ invoke__">imagecolorallocate</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// 填充背景</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagefilledrectangle</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$w</span></span><span>-</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$h</span></span><span>-</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$white</span></span><span>);

</span><span><span class="hljs-comment">// 定義樣式:5 個紅像素,5 個白像素 —— 形成明顯虛線</span></span><span>
</span><span><span class="hljs-variable">$style</span></span><span> = [
    </span><span><span class="hljs-variable">$red</span></span><span>, </span><span><span class="hljs-variable">$red</span></span><span>, </span><span><span class="hljs-variable">$red</span></span><span>, </span><span><span class="hljs-variable">$red</span></span><span>, </span><span><span class="hljs-variable">$red</span></span><span>,
    </span><span><span class="hljs-variable">$white</span></span><span>, </span><span><span class="hljs-variable">$white</span></span><span>, </span><span><span class="hljs-variable">$white</span></span><span>, </span><span><span class="hljs-variable">$white</span></span><span>, </span><span><span class="hljs-variable">$white</span></span><span>
];

</span><span><span class="hljs-comment">// 設置樣式</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagesetstyle</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-variable">$style</span></span><span>);

</span><span><span class="hljs-comment">// 使用樣式繪線:傳入特殊顏色 IMG_COLOR_STYLED</span></span><span>
</span><span><span class="hljs-comment">// 注意:imageline() 的最後一個參數接受顏色索引或特殊常量</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imageline</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-variable">$w</span></span><span> - </span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-variable">$h</span></span><span> - </span><span><span class="hljs-number">10</span></span><span>, IMG_COLOR_STYLED);

</span><span><span class="hljs-comment">// 保存到文件(示例),或使用 imagepng($im); 輸出到瀏覽器</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-keyword">__DIR__</span></span><span> . </span><span><span class="hljs-string">'/dashed_example.png'</span></span><span>);

</span><span><span class="hljs-comment">// 釋放資源</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>);
</span></span>

上面代碼將生成一個dashed_example.png ,對角線上顯示按樣式循環的虛線。關鍵點: imagesetstyle()設置樣式數組,隨後在繪線時使用IMG_COLOR_STYLED才會按樣式繪製。 TECFA PHP

帶透明像素的樣式(示例)

如果想要更細膩的點劃線,可以把樣式中某些條目設為IMG_COLOR_TRANSPARENT ,表示那一像素不繪製,從而形成空隙:

 <span><span><span class="hljs-variable">$style</span></span><span> = [</span><span><span class="hljs-variable">$black</span></span><span>, </span><span><span class="hljs-variable">$black</span></span><span>, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT]; 
</span><span><span class="hljs-title function_ invoke__">imagesetstyle</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-variable">$style</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imageline</span></span><span>(</span><span><span class="hljs-variable">$im</span></span><span>, </span><span><span class="hljs-number">20</span></span><span>, </span><span><span class="hljs-number">50</span></span><span>, </span><span><span class="hljs-number">280</span></span><span>, </span><span><span class="hljs-number">50</span></span><span>, IMG_COLOR_STYLED);
</span></span>

這樣會每兩像素繪製2 個黑點,然後跳過2 個像素,循環往復。 PHP

與畫刷(brush) 的結合使用

GD 還支持“畫刷”(通過imagesetbrush() )來繪製複雜線條。如果你為線條同時設置了樣式與畫刷,且在繪製時使用IMG_COLOR_STYLEDBRUSHED ,則GD 會把樣式索引與畫刷像素結合起來渲染。此用法適合需要按樣式切換不同刷子效果的場景(例如虛線但每段使用不同的圖案)。具體細節可參考GD 手冊中關於刷子的章節。 PHP +1

常見陷阱與註意事項

  1. 樣式數組不能為空:傳入空數組會導致失敗。 PHP

  2. 樣式元素類型:數組元素應為已分配的顏色索引( imagecolorallocate()返回值)或IMG_COLOR_TRANSPARENT常量。直接寫RGB 數組不會生效。 TECFA

  3. 樣式長度與效果:樣式數組越長越靈活,但也越耗費內存與計算(通常樣式長度很短即可)。

  4. 線條方向/斜線問題:歷史上有早期PHP/GD 的bug 影響某些斜線樣式,但現代PHP 版本中該功能已穩定。若遇到奇怪問題,先檢查PHP 與GD 擴展版本並在手動調試小例子。 PHP mwkworks.com

  5. 與圖像色彩模式的兼容:在真彩色(truecolor)圖像上使用樣式通常沒問題;在索引色(palette)圖像上要注意顏色數限制。使用imagecreatetruecolor()可避免許多色彩兼容問題。 PHP

進階用法建議

  • 用樣式+透明像素做虛線邊框或進度條刻度。

  • 將樣式數組在運行時動態生成(例如根據需要的dash 長度與gap 長度計算數組),便於復用與參數化。

  • 如需更複雜紋理(圖案段而非單像素),考慮結合imagesetbrush() ,或直接用小圖案反复繪製。 PHP

小結(要點回顧)

  • imagesetstyle()用來設定線條的像素樣式數組,配合IMG_COLOR_STYLEDimageline()等函數中使用即可實現虛線、點線等效果。 PHP +1

  • 樣式數組元素應為顏色索引或IMG_COLOR_TRANSPARENT ,且數組不能為空。 PHP

  • 若需要更複雜的線條效果,可與畫刷常量(如IMG_COLOR_STYLEDBRUSHED )或imagesetbrush()配合使用。 PHP