首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP GD 庫繪圖技術詳解:從畫布創建到圖形繪製與中文輸出

     編輯:PHP 相關知識

常見圖片格式對比

格式壓縮方式色深動畫支持適用場景
GIF無損 (LZW)256 色 (8-bit)✅ 支持簡單圖標、動畫、透明背景
JPEG/JPG有損壓縮24-bit (真彩色)❌ 不支持照片、複雜圖像、Web 圖片主流格式
PNG無損壓縮24-bit + Alpha 通道❌ 不支持 (APNG 除外)截圖、UI 元素、需透明度的圖片

GD 庫繪圖基本流程

  1. 啟用 GD 擴展 (php.ini 中 extension=gd)
  2. 創建畫布 (imagecreatetruecolor())
  3. 分配顏色 (imagecolorallocate())
  4. 繪製圖形/文本
  5. 輸出圖像 (imagepng() 等)
  6. 銷毀資源 (imagedestroy())

完整繪圖示例:圖形、文本與圖片合成

<?php
// 1. 創建 400x300 真彩色畫布 (默認黑色背景)
$img = imagecreatetruecolor(400, 300);

// 2. 分配顏色 (紅色)
$red = imagecolorallocate($img, 255, 0, 0);
$blue = imagecolorallocate($img, 0, 0, 255);
$white = imagecolorallocate($img, 255, 255, 255);

// 3. 繪製各種圖形
// 矩形邊框
imagerectangle($img, 50, 20, 100, 40, $red);
// 填充矩形
imagefilledrectangle($img, 120, 20, 170, 40, $blue);
// 直線
imageline($img, 0, 0, 400, 300, $red);
// 圓形
imageellipse($img, 300, 100, 80, 80, $blue);
// 橢圓
imageellipse($img, 300, 200, 100, 50, $red);
// 圓弧
imagearc($img, 200, 150, 100, 100, 0, 180, $blue);
// 扇形 (IMG_ARC_PIE 為實心扇形)
imagefilledarc($img, 200, 150, 100, 100, 180, 270, $red, IMG_ARC_PIE);

// 4. 輸出中文文本 (需 TTF 字體文件)
$text = "PHP 繪圖技術演示";
// imagettftext(畫布, 字號, 角度, x, y, 顏色, 字體路徑, 文本)
imagettftext($img, 24, 0, 50, 250, $white, __DIR__ . '/fonts/msyhbd.ttc', $text);

// 5. 合成外部圖片 (示例:百度 Logo)
// $srcImg = imagecreatefromgif('https://www.baidu.com/img/bd_logo.gif');
// $srcInfo = getimagesize('https://www.baidu.com/img/bd_logo.gif');
// imagecopy($img, $srcImg, 10, 10, 0, 0, $srcInfo[0], $srcInfo[1]);

// 6. 輸出為 PNG 並發送到瀏覽器
header('Content-Type: image/png');
imagepng($img);

// 7. 釋放內存
imagedestroy($img);
?>

關鍵函數速查表

功能函數說明
創建畫布imagecreatetruecolor(w, h)真彩色,推薦使用
分配顏色imagecolorallocate(img, r, g, b)返回顏色標識符
填充背景imagefill(img, x, y, color)從坐標開始泛洪填充
畫直線imageline(img, x1, y1, x2, y2, color)
畫矩形imagerectangle / imagefilledrectangle邊框/填充
畫橢圓/圓imageellipse / imagefilledellipse寬高相等即為圓
畫圓弧/扇形imagearc / imagefilledarc角度 0-360,3點鐘方向為 0
輸出文本imagestring / imagettftextTTF 支持中文、字體控制
複製圖片imagecopy / imagecopyresampled縮放複製用 resampled
輸出圖像imagepng / imagejpeg / imagegif第二參數為文件名則保存
銷毀資源imagedestroy(img)必須調用,防止內存洩漏

最佳實踐建議

  • 字體管理:將 TTF 字體文件放入項目目錄,使用絕對路徑 __DIR__ . '/fonts/xxx.ttf'
  • 錯誤處理:繪圖前檢查 GD 版本 gd_info(),捕獲函數調用失敗
  • 性能優化:大量生成時複用畫布、緩存字體對象、考慮使用 Imagick
  • 安全性:驗證用戶輸入的坐標、顏色、文本長度,防止資源耗盡

進階:使用 Imagick 替代 GD

ImageMagick (Imagick 擴展) 提供更豐富的功能:

  • 支持 100+ 格式 (含 SVG, HEIC, WebP 等)
  • 矢量繪圖、濾鏡特效、色彩空間轉換
  • 更優的內存管理與多線程支持
  • API 更現代化 (面向對象、鏈式調用)
$im = new Imagick();
$im->newImage(400, 300, 'white');
$draw = new ImagickDraw();
$draw->setFillColor('red');
$draw->rectangle(50, 20, 100, 40);
$draw->setFont(__DIR__ . '/fonts/msyhbd.ttc');
$draw->setFontSize(24);
$draw->annotation(50, 250, 'PHP 繪圖技術');
$im->drawImage($draw);
$im->setImageFormat('png');
header('Content-Type: image/png');
echo $im;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved