影象輸出
可以使用 image*
函式建立影象,其中*
是檔案格式。
他們有這個共同的語法:
bool image___(resource $im [, mixed $to [ other parameters]] )
儲存到檔案
如果要將影象儲存到檔案,可以傳遞檔名或開啟的檔案流,如 $to
。如果你傳遞流,則無需關閉它,因為 GD 會自動關閉它。
例如,要儲存 PNG 檔案:
imagepng($image, "/path/to/target/file.png");
$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)
使用 fopen
時,請確保使用 b
標誌而不是 t
標誌,因為該檔案是二進位制輸出。
千萬不能試圖通過 fopen("php://temp", $f)
或 fopen("php://memory", $f)
它。由於在呼叫之後函式關閉了流,因此你將無法進一步使用它,例如檢索其內容。
輸出為 HTTP 響應
如果你想直接返回這個影象作為影象的響應(例如建立動態徽章),你不需要傳遞任何東西(或傳遞 null
)作為第二個引數。但是,在 HTTP 響應中,你需要指定你的內容型別:
header("Content-Type: $mimeType");
$mimeType
是你要返回的格式的 MIME 型別。例子包括 image/png
,image/gif
和 image/jpeg
。
寫入變數
有兩種方法可以寫入變數。
使用 OB(輸出緩衝)
ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();
使用流包裝器
你可能有許多原因不希望使用輸出緩衝。例如,你可能已經擁有 OB。因此,需要一種替代方案。
使用 stream_wrapper_register
函式,可以註冊新的流包裝器。因此,你可以將流傳遞給影象輸出函式,並在以後檢索它。
<?php
class GlobalStream{
private $var;
public function stream_open(string $path){
$this->var =& $GLOBALS[parse_url($path)["host"]];
return true;
}
public function stream_write(string $data){
$this->var .= $data;
return strlen($data);
}
}
stream_wrapper_register("global", GlobalStream::class);
$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));
$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);
在此示例中,GlobalStream
類將任何輸入寫入引用變數(即間接寫入給定名稱的全域性變數)。稍後可以直接檢索全域性變數。
有一些特別需要注意的事項:
- 一個完全實現的流包裝類應該看起來像這樣 ,但是根據
__call
魔術方法的測試,只有stream_open
,stream_write
和stream_close
是從內部函式呼叫的。 fopen
呼叫中不需要標記,但你至少應該傳遞一個空字串。這是因為fopen
函式需要這樣的引數,即使你沒有在你的stream_open
實現中使用它,仍然需要一個虛擬引數。- 根據測試,
stream_write
被多次呼叫。記得使用.=
(連線分配),而不是=
(直接變數賦值)。
用法示例
在 <img>
HTML 標記中,可以直接提供影象而不是使用外部連結:
echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';