當前位置: 首頁> 最新文章列表> 如何利用imagefontwidth()和imagecopy()函數結合,實現在PHP中製作文字貼圖效果?

如何利用imagefontwidth()和imagecopy()函數結合,實現在PHP中製作文字貼圖效果?

M66 2025-06-15

在PHP中處理圖片和文字,常用的GD庫提供了豐富的函數,能夠幫助我們動態生成圖像。本文重點講解如何利用imagefontwidth()imagecopy()函數結合,實現文字貼圖效果。所謂文字貼圖,就是將文字“切割”成小塊或者貼圖,然後拼接到目標圖片上,達到更靈活的文字表現形式。


一、函數簡介

  • imagefontwidth(int $font): int
    返回內置字體字符寬度,$font為字體大小標識,取值1-5。此函數對確定文字寬度很有用,便於計算拼接位置。

  • imagecopy(resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h): bool
    將源圖像中的一塊區域複製到目標圖像指定位置。可用於將單個字符或切割的文字部分複制粘貼。


二、製作文字貼圖的思路

  1. 準備好包含所需文字的源圖片(通常文字寫在一個小圖裡)。

  2. 根據字體寬度和字符數量,逐字符從源圖截取文字塊。

  3. 通過imagecopy()函數將字符塊依次復製到目標圖片的指定位置。

  4. 調整位置參數,實現連貫文字貼圖效果。


三、示例代碼演示

<?php
// 創建目標圖像(白底)
$dst_width = 300;
$dst_height = 50;
$dst_im = imagecreatetruecolor($dst_width, $dst_height);
$white = imagecolorallocate($dst_im, 255, 255, 255);
imagefill($dst_im, 0, 0, $white);

// 源圖,假設是文字"HELLO"貼圖,寬高分別是每字符寬度*字符數和字符高度
// 實際使用時需要準備好包含完整文字的圖片資源
$src_im = imagecreatefrompng('http://m66.net/images/letters.png');

// 設置字體大小(內置字體,1-5)
$font = 5;
$char_width = imagefontwidth($font);
$char_height = imagefontheight($font);

// 要貼的文字
$text = "HELLO";
$len = strlen($text);

// 計算文字起始位置,使文字居中
$start_x = ($dst_width - $char_width * $len) / 2;
$start_y = ($dst_height - $char_height) / 2;

// 逐字符複製
for ($i = 0; $i < $len; $i++) {
    $char = $text[$i];
    // ASCII偏移,假设源圖文字排列是从'A'開始連續排列的
    $offset = ord($char) - ord('A');
    $src_x = $offset * $char_width;
    $src_y = 0;

    // 複製單個字符到目標圖
    imagecopy(
        $dst_im, 
        $src_im, 
        $start_x + $i * $char_width, 
        $start_y, 
        $src_x, 
        $src_y, 
        $char_width, 
        $char_height
    );
}

// 輸出圖片
header('Content-Type: image/png');
imagepng($dst_im);

// 釋放資源
imagedestroy($dst_im);
imagedestroy($src_im);
?>

四、說明與拓展

  • 本示例假設文字素材圖( letters.png )是字母按順序排列在一張橫向排列的圖片,寬度為單字符寬度乘以字符數,高度為字體高度。

  • imagefontwidth()imagefontheight()幫助我們精確獲得字符寬高,方便逐字複製。

  • 如果文字內容複雜,也可以結合imagettftext()渲染字體後再做處理,或者用imagecopyresampled()實現縮放。

  • 利用此方法,可以做出有趣的文字動畫效果、字母碎片風格貼圖,甚至製作自定義水印。