PHP Unconference Europe 2015

imagegif

(PHP 4, PHP 5)

imagegif画像をブラウザあるいはファイルに出力する

説明

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

imagegif() は画像 image から GIF ファイル filename を作成します。 引数 imageimagecreate() あるいは imagecreatefrom* 関数から返されたものです。

画像フォーマットは、imagecolortransparent() を 用いて画像を透明化しない限り GIF87a となります。 透明化した場合の画像フォーマットは GIF89a となります。

パラメータ

image

imagecreatetruecolor() のような画像作成関数が返す画像リソース。

filename

ファイルの保存先のパス。省略したり NULL を設定したりした場合は、画像ストリームを直接出力します。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

例1 imagegif() による画像の出力

<?php
// 新しい画像のインスタンスを作成します
$im imagecreatetruecolor(100100);

// 背景を白にします
imagefilledrectangle($im0099990xFFFFFF);

// テキスト文字列を画像の上に描画します
imagestring($im34020'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 'Converted PNG image to GIF with success!';
?>

注意

注意:

GIF のサポートは GD ライブラリのバージョン 1.6 でいったん削除され、バージョン 2.0.28 で復活しました。この間のバージョンではこの関数は使えません。 詳細な情報は » GD Project のサイトを参照ください。

以下の短いコードにより、利用可能な GD サポートの型を自動検出して 汎用性のある PHP アプリケーションを書くことが可能です。 header ("Content-Type: image/gif"); imagegif ($im); の部分を、より柔軟性のある このコードに置換してください。

<?php
// Create a new image instance
$im imagecreatetruecolor(100100);

// Do some image operations here

// Handle output
if(function_exists('imagegif'))
{
    
// For GIF
    
header('Content-Type: image/gif');

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

    
imagejpeg($imNULL100);
}
elseif(
function_exists('imagepng'))
{
    
// For PNG
    
header('Content-Type: image/png');

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

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

    die(
'No image support in this PHP server');
}

// If image support was found for one of these
// formats, then free it from memory
if($im)
{
    
imagedestroy($im);
}
?>

注意:

4.0.2 以降では、種々のイメージ関数の サポートを調べるために function_exists() の 代わりに関数 imagetypes() を使用することが可能です。

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

参考

  • imagepng() - PNG イメージをブラウザまたはファイルに出力する
  • imagewbmp() - 画像をブラウザあるいはファイルに出力する
  • imagejpeg() - 画像をブラウザあるいはファイルに出力する
  • imagetypes() - この PHP がサポートしている画像形式を返す

add a note add a note

User Contributed Notes 12 notes

up
8
coldume
1 year ago
To keep GIF animation, you can try the class writing based on GD
GD Enhancer http://www.gdenhancer.com/
up
2
stefan at colulus dot com
6 years ago
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);

?>
up
1
grant k.
4 years ago
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.
?>
up
0
mail at ignore dot area dot nospam dot joshho dot com
2 years ago
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);
?>
up
0
alan hogan dot com slash contact
6 years ago
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
up
0
rokfaith at gmail dot com
8 years ago
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.
up
0
Lauri Harpf
9 years ago
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.
up
0
jemore at nospam dot m6net dot fr
10 years ago
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.
up
0
polone at townnews dot com
12 years ago
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.
up
0
kremlin at home dot com
13 years ago
Animated GIFs as well as transparent GIFs qualify as GIF89a's and you should use ImageColorTransparent().
up
0
david at hooshla dot com
14 years ago
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.
up
-1
Leigh Purdie
9 years ago
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>
To Top