• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imagegif()

    (PHP 4, PHP 5, PHP 7)

    输出图象到浏览器或文件。

    说明

    imagegif(resource $image[,string $filename]): bool

    imagegif()$image图像以$filename为文件名创建一个GIF图像。$image参数是imagecreate()或imagecreatefrom*函数的返回值。

    图像格式为GIF87a。如果用了imagecolortransparent()使图像为透明,则其格式为GIF89a。

    参数

    $image

    由图象创建函数(例如imagecreatetruecolor())返回的图象资源。

    $filename

    文件保存的路径,如果未设置或为NULL,将会直接输出原始图象流。

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    使用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);
    ?>
    

    使用imagegif()将一个 PNG 转换成 GIF

    <?php
    // 载入 PNG
    $png = imagecreatefrompng('./php.png');
    // 以 GIF 保存图像
    imagegif($png, './php.gif');
    // 释放内存
    imagedestroy($png);
    // 完工
    echo 'Converted PNG image to GIF with success!';
    ?>
    

    注释

    Note:

    不过从GD库 1.6 起所有的GIF支持都移除了,并在版本 2.0.28 中加了回来。如果使用这些版本之间的 GD 库时本函数不可用。更多信息见» GD Project站点。

    以下代码段通过自动检测 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('No image support in this PHP server'); } // 如果发现图像是以上的格式之一,就从内存中释放 if($im) { imagedestroy($im); } ?>

    Note:

    自 PHP 3.0.18 和 4.0.2 起可以用imagetypes()函数代替function_exists()来检查是否支持某种图像格式:<?php if(imagetypes() & IMG_GIF) { header('Content-Type: image/gif'); imagegif($im); } elseif(imagetypes() & IMG_JPG) { /* ... etc. */ } ?>

    参见

    • imagepng()以 PNG 格式将图像输出到浏览器或文件
    • imagewbmp()以 WBMP 格式将图像输出到浏览器或文件
    • imagejpeg()输出图象到浏览器或文件。
    • imagetypes()返回当前 PHP 版本所支持的图像类型
    To keep GIF animation, you can try the class writing based on GD 
    GD Enhancer http://www.gdenhancer.com/
    Using <IMG SRC="image.php"> to dynamically generate images is a bit problematic regarding cache. Unless caching is activated, IE seems to get confused about the type of the image when attempting to save it. A .GIF created in the above way causes the browser to suggest saving the image with .BMP, not .GIF.
    A solution is to activate cache with session_cache_limiter('public'); in "image.php", after which IE will correctly save as .GIF. If you do not want the cache to block any changes in the dynamic image, make sure that the SRC keeps changing with every reload. Something like "image.php/" . mt_rand(1,100000) . ".gif" seems to work well.
    Might be trivial to some, but I spent a couple of hours figuring out why IE always wants to save my dynamic .GIF's as .BMP's.
    I worked out a script that allows the transfer of alphanumeric data to be placed on an image. The HTML feature is img src and the php feature is imagettftext. This simple code will increment from 1 to 3 on images.
    code:
    <?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);
    ?>
    
    read also RFC2557: http://www.ietf.org/rfc/rfc2557.txt
    For handling inline images in email.
    ----
    I've been playing around with the "data" URL scheme as proposed by RFC 2397 which states how to perform inline, bas64 encoded images. A number of browsers support this format from some of my tests and would be an interesting way of removing overhead from multiple HTTP connections. Basically, the IMG tag would be:
    <IMG SRC="/-/data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH hhx4dbgYKAAA7" ALT="Larry">
    Something like that. Note also that I start the URI with "/-/" before the rest of the data scheme spec. If you don't start it with this, it won't work in a lot of the different browsers I tested (such as IE). Note this is useful for very small images only (as most browsers appear to have a limitation on the size of HTML element data of 1024). Browsers where this syntax worked that I tested are the following:
    IE 6.x (windows)
    Mozilla 0.97+ (linux)
    Opera 5, 6 (windows)
    Netscape 4.7+ (mac, windows)
    IE 5 (macintosh)
    This should work for other image types as well, such as PNG. JPEG files aren't really suggested (usually, these files are too large). BTW - there is no advantage to this method if the image will appear more than ONCE in the page because you will be transmitting the same data multiple times as opposed to just once (most browsers realize that already downloaded data that has multiple references only requires one HTTP call).
    Consider using this method if you want to make a single PHP program that outputs both text and an image AND you want to make only on HTTP call. Cheers.
    apparently GD does not support animated GIFs.
    instead, we're stuck with the old fashioned way:
    <?php
    header('Content-Type: image/gif');
    echo file_get_contents($destPathImage);
    ?>
    
    It should be noted that if you only want to "save" the file, and not display it to the browser, you should catch the imagegif into a variable.
    Example:
    <?php
    //Only saves the file to a destination, no display
    $image_value = imagegif($image, $save_file_to_path);
    //Saves file and attempts to display it, but will throw an error message
    imagegif($image, $save_file_to_path);
      
    //Only displays, never saves as a file
    imagegif($image);
    //Note: In [my] third example, for displaying only, it is probably good to use the "header('Content-type: image/gif'); declaration, but it's not needed in the first example for saving as a .gif file.
    ?>
    
    to create an animated gif with gifsicle, but without storing temporary images on disk:
    <?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);
    ?>
    just define $outfile and RenderFrame(), and that's it.
    Animated GIFs as well as transparent GIFs qualify as GIF89a's and you should use ImageColorTransparent().
    If you open a truecolor image (with imageCreateFromPng for example), and you save it directly with imagegif, you can have a 500 internal server error. You must use imageTrueColorToPalette to reduce to 256 colors before saving the image in GIF format.
    This is how you load and display an image file:
    <?php
    Header("Content-Type: image/gif");
    $fn=fopen("./imagefile.gif","r");
    fpassthru($fn);
    ?>
    Note that there are no new-lines in the content type header.
    Note that you *can* save with a transparent color **and dither** using GD2.
    For a useful example, see the png-to-gif function in my coment here:
    http://www.php.net/manual/en/function.imagecolorat.php
    Simple animated-gif hack (requires 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>

    上篇:imagegetclip()

    下篇:imagegrabscreen()