影象輸出

可以使用 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/pngimage/gifimage/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_openstream_writestream_close 是從內部函式呼叫的。
  • fopen 呼叫中不需要標記,但你至少應該傳遞一個空字串。這是因為 fopen 函式需要這樣的引數,即使你沒有在你的 stream_open 實現中使用它,仍然需要一個虛擬引數。
  • 根據測試,stream_write 被多次呼叫。記得使用 .=(連線分配),而不是 =(直接變數賦值)。

用法示例

<img> HTML 標記中,可以直接提供影象而不是使用外部連結:

echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';