PHP 大会日本 2024

imagegif

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

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

描述

imagegif(GdImage $image, 资源|字符串| $file = null): 布尔值

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

除非图像已使用 imagecolortransparent() 设置为透明,否则图像格式将为 GIF87a,在这种情况下,图像格式将为 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 库', 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)
{
/* ... 等。 */
}
?>

参见

添加注释

用户贡献的注释 12 条注释

4
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/Xl4f5VWzXyym7PH hhx4dbgYKAAA7" ALT="Larry">

诸如此类。另请注意,我在数据方案规范的其余部分之前以“/-/”开头 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 调用,请考虑使用此方法。干杯。
2
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);
?>
0
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 -- 此脚本创建一个正方形图像并在其上放置文本。

// 图像大小和颜色
$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);

// 图像创建
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);

// 确定图像的数字中心
$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])));

// 在图像上放置数字信息
ImageTTFText($im,45,0,($X-1),$Y,$color4,'impact',$_GET['$text']);

// 将完成的图像返回给调用脚本
Header('Content-Type: image/png');
Imagegif($im);

?>
0
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(),就完成了。
-2
jemore at nospam dot m6net dot fr
21 年前
如果您打开一个真彩色图像(例如使用 imageCreateFromPng),然后直接使用 imagegif 保存它,可能会出现 500 内部服务器错误。在以 GIF 格式保存图像之前,您必须使用 imageTrueColorToPalette 将其减少到 256 色。
-2
coldume
11 年前
要保留 GIF 动画,您可以尝试使用基于 GD 的类编写
GD Enhancer http://www.gdenhancer.com/
-1
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。
-1
kremlin at home dot com
23 年前
动画 GIF 以及透明 GIF 都属于 GIF89a,您应该使用 ImageColorTransparent()。
-2
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 文件的示例中不需要。
?>
-5
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>
-5
david at hooshla dot com
24 年前
这是加载和显示图像文件的方法

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

请注意,内容类型标头中没有换行符。
-5
alan hogan dot com slash contact
17 年前
请注意,您可以使用 GD2 保存具有透明颜色**和抖动**。
有关有用的示例,请参阅我此处评论中的 png-to-gif 函数
https://php.net/manual/en/function.imagecolorat.php
To Top