PHP Conference Japan 2024

imagegif

(PHP 4, PHP 5, PHP 7, PHP 8)

imagegif將影像輸出到瀏覽器或檔案

說明

imagegif(GdImage $image, 資源|字串|null $file = null): 布林值

imagegif() 從影像 image 建立 GIF 檔案到 file 中。 image 參數是 imagecreate()imagecreatefrom* 函式的回傳值。

影像格式預設為 GIF87a,除非影像已使用 imagecolortransparent() 設定透明色彩,此時影像格式將會是 GIF89a

參數

image

一個 GdImage 物件,由其中一個影像建立函式,例如 imagecreatetruecolor(),所回傳。

file

要儲存檔案的路徑或開啟的串流資源(此函式回傳後會自動關閉)。如果未設定或為 null,則會直接輸出原始影像串流。

回傳值

成功時回傳 true,失敗時回傳 false

注意事項

然而,如果 libgd 輸出影像失敗,此函式會回傳 true

更新日誌

版本 說明
8.0.0 image 現在預期是一個 GdImage 實例;先前預期是一個有效的 gd 資源

範例

範例 #1 使用 imagegif() 輸出影像

<?php
// 建立新的影像實例
$im = imagecreatetruecolor(100, 100);

// 將背景設為白色
imagefilledrectangle($im, 0, 0, 99, 99, 0xFFFFFF);

// 在影像上繪製文字字串
imagestring($im, 3, 40, 20, 'GD Library', 0xFFBA00);

// 將影像輸出到瀏覽器
header('Content-Type: image/gif');

imagegif($im);
imagedestroy($im);
?>

範例 #2 使用 imagegif() 將 PNG 影像轉換為 GIF

<?php

// 載入 PNG
$png = imagecreatefrompng('./php.png');

// 將影像儲存為 GIF
imagegif($png, './php.gif');

// 從記憶體釋放
imagedestroy($png);

// 完成
echo '成功將 PNG 影像轉換為 GIF!';
?>

註釋

註釋:

以下程式碼片段允許您透過自動偵測可用的 GD 支援類型來撰寫更具可攜性的 PHP 應用程式。將 header ("Content-Type: image/gif"); imagegif ($im); 序列取代為更具彈性的序列

<?php
// 建立新的圖像實例
$im = imagecreatetruecolor(100, 100);

// 在此處進行一些圖像操作

// 處理輸出
if(function_exists('imagegif'))
{
// 適用於 GIF
header('Content-Type: image/gif');

imagegif($im);
}
elseif(
function_exists('imagejpeg'))
{
// 適用於 JPEG
header('Content-Type: image/jpeg');

imagejpeg($im, NULL, 100);
}
elseif(
function_exists('imagepng'))
{
// 適用於 PNG
header('Content-Type: image/png');

imagepng($im);
}
elseif(
function_exists('imagewbmp'))
{
// 適用於 WBMP
header('Content-Type: image/vnd.wap.wbmp');

imagewbmp($im);
}
else
{
imagedestroy($im);

die(
'此 PHP 伺服器不支援圖像');
}

// 如果找到其中一種格式的圖像支援,則將其從記憶體中釋放
if($im)
{
imagedestroy($im);
}
?>

註釋:

您可以使用 imagetypes() 函式來檢查各種支援的圖像格式是否存在。

<?php
if(imagetypes() & IMG_GIF)
{
header('Content-Type: image/gif');
imagegif($im);
}
elseif(
imagetypes() & IMG_JPG)
{
/* ... 等等 */
}
?>

另請參閱

  • imagepng() - 將 PNG 圖像輸出到瀏覽器或檔案
  • imagewbmp() - 將圖像輸出到瀏覽器或檔案
  • imagejpeg() - 將影像輸出至瀏覽器或檔案
  • imagetypes() - 返回這個 PHP 版本所支援的影像類型
新增註解

使用者貢獻的註解 12 則註解

polone at townnews dot com
22 年前
另請參閱 RFC2557: http://www.ietf.org/rfc/rfc2557.txt
用於處理電子郵件中的內嵌影像。
----


我一直在嘗試 RFC 2397 提出的「data」URL 方案,它說明了如何執行內嵌的 base64 編碼影像。根據我的一些測試,許多瀏覽器都支援這種格式,這將是一種有趣的方式來消除多個 HTTP 連線的負擔。基本上,IMG 標籤會是

<IMG SRC="/-/data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH hhx4dbgYKAAA7" ALT="Larry">

類似這樣。還要請注意,我在其餘的 data scheme 規範之前,以「/-/" 開始 URI。如果您不以此開頭,它在我測試的許多不同瀏覽器(例如 IE)中都無法運作。請注意,此方法僅適用於非常小的影像(因為大多數瀏覽器似乎將 HTML 元素資料的大小限制為 1024)。我測試過,此語法有效的瀏覽器如下:

IE 6.x (Windows)
Mozilla 0.97+ (Linux)
Opera 5, 6 (Windows)
Netscape 4.7+ (Mac, Windows)
IE 5 (Macintosh)

這也應該適用於其他影像類型,例如 PNG。不建議使用 JPEG 檔案(通常這些檔案太大)。順帶一提,如果影像在頁面中出現多次,則此方法沒有優勢,因為您將多次傳輸相同的資料,而不是只傳輸一次(大多數瀏覽器都意識到,已經下載的具有多個參考的資料只需要一個 HTTP 呼叫)。

如果您想製作一個同時輸出文字和影像的 PHP 程式,並且只想進行一次 HTTP 呼叫,請考慮使用此方法。加油。
mail at ignore dot area dot nospam dot joshho dot com
12 年前
顯然 GD 不支援動畫 GIF。

相反地,我們只能使用老方法
<?php
header
('Content-Type: image/gif');
echo
file_get_contents($destPathImage);
?>
stefan at colulus dot com
16 年前
我設計了一個腳本,允許將字母數字資料放置在影像上。HTML 功能是 img src,PHP 功能是 imagettftext。這個簡單的程式碼會在影像上從 1 遞增到 3。

程式碼

<?php
//ImageCall.php -- 這個腳本會呼叫另一個腳本以產生圖片。
for($next = 1;$next < 4; $next++){
print
"圖片 $next:<br>";
print
"<img src = 'Image.php?\$text=$next'>";
print
"<br><br>";
}
?>

<?php
//Image.php -- This script creates a square image and places the text on it.

// image size and color
$im = ImageCreate(77,77);
$color1 = ImageColorAllocate($im,0x66,0xCC,0x00);
$color2 = ImageColorAllocate($im,0x33,0x66,0x00);
$color3 = ImageColorAllocate($im,0x00,0x99,0x00);
$color4 = ImageColorAllocate($im,0x3D,0x3D,0x3D);

// image creation
ImageFilledRectangle($im,1,1,76,76,$color1);
ImageFilledpolygon($im, array (76,1,1,76,76,76),3,$color2);
ImageFilledRectangle($im,5,5,72,72,$color3);

// determine numeric center of image
$size = ImageTTFBBox(45,0,'impact',$_GET['$text']);
$X = (77 - (abs($size[2]- $size[0])))/2;
$Y = ((77 - (abs($size[5] - $size[3])))/2 + (abs($size[5] - $size[3])));

//places numeric information on image
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

//returns completed image to calling script
Header('Content-Type: image/png');
Imagegif($im);

?>
rokfaith at gmail dot com
18 年前
使用 gifsicle 建立動畫 GIF,但無需將暫存圖片儲存到磁碟。

<?php
$cmd
= 'gifsicle --loop -O1 --multifile --delay 25 - > '.$outfile;
$desc = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w"));
$proc = proc_open($cmd, $desc, $pipes);
if (!
is_resource($proc)) {
die(
'無法啟動 gifsicle');
}
for (
$frame=0; $frame<$total_frames; $frame++) {
$image = RenderFrame($frame);
ob_start();
imagegif($image);
fwrite($pipes[0], ob_get_contents());
ob_end_clean();
imagedestroy($image);
}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
?>

只需定義 $outfile 和 RenderFrame() 即可。
jemore at nospam dot m6net dot fr
21 年前
如果您開啟一個真彩圖像(例如使用 imageCreateFromPng),並直接使用 imagegif 儲存它,可能會發生 500 內部伺服器錯誤。您必須先使用 imageTrueColorToPalette 將其減少到 256 色,才能以 GIF 格式儲存圖像。
coldume
11 年前
要保留 GIF 動畫,您可以嘗試基於 GD 編寫的類別
GD Enhancer http://www.gdenhancer.com/
Lauri Harpf
19 年前
使用 <IMG SRC="image.php"> 動態產生圖像在快取方面有點問題。除非啟用快取,否則 IE 在嘗試儲存圖像時似乎會混淆圖像的類型。以上述方式建立的 .GIF 會導致瀏覽器建議以 .BMP 而不是 .GIF 儲存圖像。

解決方案是在 "image.php" 中使用 session_cache_limiter('public'); 啟用快取,之後 IE 將正確地儲存為 .GIF。如果您不希望快取阻止動態圖像中的任何更改,請確保 SRC 每次重新載入時都會更改。類似 "image.php/" . mt_rand(1,100000) . ".gif" 的做法似乎效果很好。

對某些人來說可能很簡單,但我花了好幾個小時才弄清楚為什麼 IE 總是想把我的動態 .GIF 儲存為 .BMP。
kremlin at home dot com
23 年前
動畫 GIF 和透明 GIF 都屬於 GIF89a 規格,您應該使用 ImageColorTransparent() 函式。
grant k.
14 年前
需要注意的是,如果您只想「儲存」檔案,而不是在瀏覽器中顯示它,您應該將 imagegif 的輸出擷取到一個變數中。

範例

<?php
//僅儲存檔案到目的地,不顯示

$image_value = imagegif($image, $save_file_to_path);

//儲存檔案並嘗試顯示它,但會拋出錯誤訊息

imagegif($image, $save_file_to_path);

//僅顯示,不儲存為檔案
imagegif($image);

//注意:在[我的]第三個範例中,僅用於顯示時,最好使用 "header('Content-type: image/gif');" 宣告,但在第一個範例中儲存為 .gif 檔案時則不需要。
?>
Leigh Purdie
19 年前
簡單的動畫 GIF 技巧(需要 ImageMagick)

<html><body>
<?php
$icount
=0;
for(
$count=0;$count<40;$count++) {
$im=imagecreate(200,200);
imagecolorallocate($im,0,0,255);
$white=imagecolorallocate($im,255,255,255);
imagerectangle($im,$count,$count,200-$count,200-$count,$white);
$icount++;
$tcount=sprintf("%04d",$icount);
imagegif($im,"/tmp/test-$tcount.gif");
imagedestroy($im);
}
exec("/usr/bin/convert -delay 2 -loop 10 /tmp/test*.gif /var/www/html/Tests/Test-Anim.gif");
?>
<img src="/Tests/Test-Anim.gif">
</body>
</html>
david at hooshla dot com
24 年前
這是載入和顯示影像檔的方法

<?php
Header
("Content-Type: image/gif");
$fn=fopen("./imagefile.gif","r");
fpassthru($fn);
?>

請注意,內容類型標頭中沒有換行符號。
alan hogan dot com slash contact
17 年前
請注意,使用 GD2 *可以*儲存具有透明顏色**和抖動**的影像。
有關有用的範例,請參閱我在此處評論中的 png-to-gif 函數
https://php.dev.org.tw/manual/en/function.imagecolorat.php
To Top