PHP 程式設計/影像
PHP 可以使用 GD 圖形庫(預設情況下從 PHP 3.0 開始包含)動態地建立和修改影像。
建立新影像需要幾個步驟:
- 載入新影像或現有影像到記憶體。
- 可選載入要新增的顏色。
- 可選修改元件(建立線條、點、填充、新增文字等)。
- 透過在標頭中釋出影像型別來恢復影像。
- 釋放記憶體。
要從無到有建立影像,請使用以下函式:
imagecreatetruecolor($height, $width)
該函式在記憶體中建立一個新影像,其高度和寬度以畫素定義,並返回對新影像的引用。
還有一個用於此目的的函式,但它不推薦,因為其顏色幅度較差[1]
imagecreate($height, $width)
要將磁碟上儲存的影像載入到記憶體中,請使用以下函式:
imagecreatefrom<type>($path)
示例
$img = imagecreatefrompng('image.png');
其他函式
imagecreatefromstring($text)
該函式根據引數中指定的文字格式建立影像。
如果發生錯誤,這些函式將返回 false。
要分配顏色,必須定義 RGB 引數。
$color = imagecolorallocate($image,$r,$g,$b)
要在 PNG 中定義透明度,請使用以下函式:
imagecolortransparent($image,$color)
其中 $color 是 imagecolorallocate 的結果。
還可以使用以下函式確定透明度,範圍為 0 到 127(表示完全透明):
imagecolorallocatealpha($image,$r,$g,$b,$transparency)
注意:第一個分配的顏色定義了整個影像的背景。
建立和著色影像後,就可以對其應用以下操作:
- 繪製一些畫素(例如:建立線條)。
- 透過指定區域來修改現有畫素。
要繪製畫素,我們使用其座標(以下為 x, y)
imagesetpixel(image, x, y, color)
要在兩點之間繪製一條線,請使用以下函式:
imageline(image, x1, y1, x2, y2, color)
要從對角線建立矩形,請使用以下函式:
imagerectangle(image, x1, y1, x2, y2, color)
要從中心、高度和寬度表示橢圓,請使用以下函式:
imageellipse(image, x, y, h, l, color)
或者透過在梯度(按順時針編號)中指定其弧度來表示:
imagearc(image, x, y, h, l, angle1, angle2, color)
用於修改影像(如照片)的最常用的函式無疑是 imagecopyresized,它允許複製矩形區域並將其貼上到另一個影像中[2]。示例
imagecopyresized(dst_image, src_image, dst_x, dst_y, src_x, src_y, dst_w, dst_h, src_w, src_h);
其中:
src_image是源影像;dst_image是目標影像;dst_x, dst_y是dst_image的座標;src_x, src_y是src_image的座標,從左上角開始;dst_w, dst_h, src_w, src_h是源和目標矩形的寬度和高度。
因此,如果 dst_w 等於 src_w,並且 dst_h 等於 src_h,則影像矩形部分將保持相同大小。相反,我們將拉伸或放大影像。
imagecopyresampled 函式接收與 imagecopyresized 相同的引數,但在調整大小的情況下,質量得到提升。
此外,還存在 imagefilter 函式,它允許實現多種效果,例如灰度、浮雕或重新著色[3]。
可以透過名為 header 的函式使用 content-type(預設情況下為 text/html)來指定獲得的影像格式(“png”、“jpeg”或“gif”)。
header("Content-type: image/<type>");
要之後視覺化影像,請根據其型別將其作為引數放在函式中:imagepng、imagejpeg 或 imagegif。
然後,使用 imagedestroy($image) 釋放記憶體。此步驟是可選的,但強烈建議在處理大型影像時執行。
以下程式碼在瀏覽器中顯示一個 100 畫素黑色正方形內的 50 畫素紅色正方形。
$image = imagecreatetruecolor(100, 100);
$color = imagecolorallocate($image, 255, 0, 0);
imagefilledrectangle($image,0,0,50,50,$color);
header("Content-type: image/png");
imagepng($image);
imagedestroy($image);