簡介
php並不僅限於創建html輸出,它也可以創建和處理包括GIF,PNG,jpef,wbmp以及xpm在內的多種格式的圖像。更加方便的是,php可以直接將圖像數據庫輸出到瀏覽器。要想在php中使用圖像處理功能,你需要連帶gd庫一起來編譯php。gd庫和php可能需要其他的庫,這取決於你要處理的圖像格式。
你可以使用PHP中的圖像函數來獲取下列格式圖像的大小:jpeg,gif,png,swf,tiff和jpeg2000.
如果聯合exif擴展一起使用,你可以操作存儲在jprg和tiff圖像文件頭部的信息,這樣就可以獲取數碼相機所產生的元數據。exif相關的函數不需要gd庫亦可使用。
getimagesize()函數不需要gd擴展庫。
|
格式 支持讀取 支持寫入 備注 |
JPEG TRUE TRUE GD 1.8+ |
PNG TRUE TRUE |
GIF TRUE TRUE GD 1.6 和 GD 2.0.28 之間的版本不支持 |
XBM TRUE TRUE PHP 4.0.1 開始支持讀取,PHP 5.0.0 開始支持寫入 |
XPM TRUE FALSE PHP 4.0.1 開始支持讀取。Windows 平台上不可用。需要 PHP 綁定的 GD 庫 |
WBMP TRUE TRUE GD 1.8+ |
WebP TRUE TRUE GD 2.1+, PHP 5.5+ |
|
很遺憾的是,雖然上表中顯示大部分圖像格式都是支持讀取和寫入的,但是代表你的PHP環境在編譯的時候是支持這些操作的。要想檢測gd庫所支持的格式,請使用gd_info()函數。
需求
如果你有gd庫(可從http://www.libgd.org獲得),你就可以創建和處理圖像。
可以處理的圖像格式由你所使用的gd庫版本以及gd庫可能需要的其他庫決定。GD-1.6之前的版本呢支持gif格式,但是不支持png格式。gd1.6以上,gd2.0.28以下的版本支持Png,但是不支持gif格式。在gd2.0.28中,又重新啟用了對於gif格式的支持。
Note: 從 PHP 4.3 開始就綁定了 GD 庫。 這個版本的庫中還提供了一些額外增加的功能,例如透明混> > 合處理。 這個版本的代碼被很好的維護着,並且運行穩定, 所以建議優先選擇綁定版本。
安裝
在windows中,需要將gd2的dll文件php_gd2.dll作為一個擴展包含在php.ini中。gd1的dll文件php_gd.dll在php4.3.2中被刪除了。此外要注意首選的真彩色圖像函數,例如imagecreatetruecolor(),需要gd2.
Note
要在windows下啟用exif,在php.ini中php_mbstring.dll必須在php_exif.dll之前加載。
預定義常量
GD_VERSION(); PHP編譯所依據的GD版本。
GD_MAJOR_VERSION(); PHP編譯所依據的大版本。
GD_MINOR_VERSION(); PHP編譯所依據的gd小版本。
GD_RELEASE_VERSION(); PHP編譯所依賴的GD發布版本。
GD_EXTRA_VERSION (string) PHP 編譯所依據的 GD 擴展版本(beta/rc..)。 (PHP 5.2.4 可用) GD_BUNDLED (integer) 當使用綁定版本的 GD 時,此值為 1, 反之為 0。
...
Example 1
<?php
header("Content-type: image/png");
$string = $_GET['text'];
$im = imagecreatefrompng("images/button1.png");
$orange = imagecolorallocate($im, 220, 210, 60);
$px = (imagesx($im) - 7.5 * strlen($string)) / 2;
imagestring($im, 3, $px, 9, $string, $orange);
imagepng($im);
imagedestroy($im);
?>
Example 2
使用Alpha為圖片添加水印
<?php
// 加載水印以及要加水印的圖像
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');
// 設置水印圖像的外邊距,並且獲取水印圖像的尺寸
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// 利用圖像的寬度和水印的外邊距計算位置,並且將水印復制到圖像上
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
// 輸出圖像並釋放內存
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Example 3
使用imagecopymerge()函數創建半透明水印
<?php
// 加載要加水印的圖像
$im = imagecreatefromjpeg('photo.jpeg');
// 首先我們從 GD 手動創建水印圖像
$stamp = imagecreatetruecolor(100, 70);
imagefilledrectangle($stamp, 0, 0, 99, 69, 0x0000FF);
imagefilledrectangle($stamp, 9, 9, 90, 60, 0xFFFFFF);
$im = imagecreatefromjpeg('photo.jpeg');
imagestring($stamp, 5, 20, 20, 'libGD', 0x0000FF);
imagestring($stamp, 3, 20, 40, '(c) 2007-9', 0x0000FF);
// 設置水印圖像的位置和大小
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);
// 以 50% 的透明度合並水印和圖像
imagecopymerge($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp), 50);
// 將圖像保存到文件,並釋放內存
imagepng($im, 'photo_stamp.png');
imagedestroy($im);
?>