imagegif

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

imagegif将图像输出到浏览器或文件

描述

imagegif(GdImage $image, resource|string|null $file = null): bool

imagegif() 从图像 image 中创建 GIF 文件到 fileimage 参数是 imagecreate()imagecreatefrom* 函数的返回值。

图像格式将为 GIF87a,除非图像使用 imagecolortransparent() 设为透明,在这种情况下,图像格式将为 GIF89a

参数

image

一个 GdImage 对象,由图像创建函数(如 imagecreatetruecolor())返回。

file

要保存文件的路径或打开的流资源(在该函数返回后自动关闭)。如果未设置或为 null,则原始图像流将直接输出。

返回值

成功时返回 true,失败时返回 false

注意

但是,如果 libgd 无法输出图像,则此函数返回 true

变更日志

版本 描述
8.0.0 image 现在期望一个 GdImage 实例;以前,期望的是一个有效的 gd resource

示例

示例 #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)
{
/* ... etc. */
}
?>

参见

添加注释

用户贡献的注释 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 F81M1OIcR7EewwcLp7tuNNkM3uNna3F2JQFo97Vriy/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 -- This script will call a script to produce the image.
for($next = 1;$next < 4; $next++){
print
"Image $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(
'Unable to start 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
20 年前
如果您打开一个真彩色图像(例如使用 imageCreateFromPng),然后直接使用 imagegif 保存它,则可能会出现 500 内部服务器错误。在以 GIF 格式保存图像之前,必须使用 imageTrueColorToPalette 将其减少到 256 色。
coldume
10 年前
为了保留 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
16 年前
请注意,您可以使用 GD2 以透明颜色**和抖动**保存。
有关实用示例,请参阅我在这里的评论中的 png-to-gif 函数
https://php.net/manual/en/function.imagecolorat.php
To Top