所以,不爲了嚴格要求學習者,Marc B建議的解決方案更接近於imagejpeg()
函數:
bool imagejpeg (resource $image [, string $filename [, int $quality ]])
因此,有第二個可選參數$filename
,如果給出,它會告訴GD將圖像存儲在該文件中。
但是它也說,如果你傳遞一個文件名,圖像不會自動輸出到瀏覽器,因爲如果你不通過第二個參數就會發生這種情況。
因此,有三個步驟,你將必須做到:
創建唯一的文件名
保存圖像瀏覽器中的文件
顯示圖像
現在最簡單的解決方案是:
/* --- create unique filename --- */
// get name passed or set default, this will be prepended to
// the unique filename to make it more readable
$prepend_filename = (isset($_GET['name']) ? rawurlencode(trim($_GET['name'])) : 'ing';
// set to the path where you want your images stored
$dirname = "/your/base/path/wherever/";
// use a while loop to make sure or new filename does not exist
while (true) {
// now build unique filename
$filename = uniqid($prepend_filename, true) . '.jpg';
// if filename is unique (file does not exist) then exit loop
if (!file_exists($dirname . $filename)) break;
}
/* --- save image to file --- */
imagejpeg($jpg_image, $dirname . $filename);
/* --- output image to browser --- */
readfile($dirname . $filename);
所以這將基本上工作。唯一不太好的解決方案是,首先您要訪問磁盤來寫入映像,然後您必須重新訪問該文件以將其輸出到瀏覽器。還有另一種技術,您可以使用,以減少文件訪問:
/* --- output image to browser ---*/
// use output buffering to capture outputted image stream
ob_start();
// output the image to output buffer
imagejpeg($jpg_image);
// stop capture, flush output to browser and save as string
$img_data = ob_get_flush();
/* --- save image to file --- */
$fp = fopen($dirname . $filename, 'w');
fwrite($fp, $img_data);
fclose($fp);
所以這樣做的好處是,你不會有兩次訪問磁盤。
如果您不想將圖像作爲原始圖像格式返回,但實際上希望立即將其顯示在您的html頁面中,則有兩種方法。
方法1(刪除上面重複部分的註釋)在這裏我們創建圖像,保存它的文件並用我們創建的文件名生成html輸出。
<?php
/* --- create unique filename --- */
$prepend_filename = (isset($_GET['name']) ? rawurlencode(trim($_GET['name'])) : 'ing';
$dirname = "/your/base/path/wherever/";
while (true) {
$filename = uniqid($prepend_filename, true) . '.jpg';
if (!file_exists($dirname . $filename)) break;
}
/* --- save image to file --- */
imagejpeg($jpg_image, $dirname . $filename);
// now the difference starts
?><html>
<head>
<title>Your title here</title>
<!-- the rest of your head here -->
</head>
<body>
<img src="http://yourserver.com/your/base/path/wherever/<?php
echo $filename;
?>" width="100%" />
</body>
</html>
方法2開始是與上述相同,差別開始保存圖像時,我們再次使用輸出緩衝方法,但此時,我們的輸出傳遞給IMG標記爲base64編碼的字符串。討厭,討厭:)
/* Generating the filename is the same as above (not copied here).
Output buffering same as prior sample, with one difference:
Now we use ob_get_clean() instead of ob_get_flush() because
we do not want to output image.
*/
ob_start();
imagejpeg($jpg_image);
$img_data = ob_get_clean(); // NOTE: ob_get_clean() not ob_get_flush()
/* --- save image to file --- */
$fp = fopen($dirname . $filename, 'w');
fwrite($fp, $img_data);
fclose($fp);
?><html>
<head>
<title>Your title here</title>
<!-- the rest of your head here -->
</head>
<body>
<img src="data:image/jpeg;base64,<?php
echo base64_encode($img_data);
?>" width="100%" />
</body>
</html>
所以在這裏我們使用的緩衝$img_data
的文件寫入到磁盤和在HTML頁面中直接輸出,而不必調用從服務器上的文件瀏覽器(但具有較大的HTML源明顯)
rtfm:http://php.net/imagejpeg,特別要注意其第二個(可選)參數... –
請不要給這些鏈接,因爲我不明白我的理解與真實的工作示例 – learner
那麼你不會在這個行業中走得很遠。要麼學會閱讀文件,要麼找到不同的職業。 –