Reputation: 11
I'm trying to display only the first frame of an animated GIF to a PNG to use as a thumbnail. I currently have this code:
<?php
function myImageCreateFromGif($file_or_url) {
$dummy_file = "/tmp/dummy.gif";
# if this is a url, use fopen to get the file data, then
# save it to a dummy file
if (preg_match("/(http|ftp):\/\//i", $file_or_url)) {
# open the file using fopen, which supports remote URLs
$input = fopen($file_or_url, "rb");
# read the contents of the file
# will accept files up to 10Mb, but will probably get
# and EOF before that, we have to do it this way because
# filesize isn't designed to work with URLs. sigh.
$image_data = fread($input, 10000000);
fclose($input);
# write the contents to a dummy file
$output = fopen("$dummy_file", "wb");
fwrite($output, $image_data);
fclose($output);
# create the gif from the dummy file
$image = ImageCreateFromGif($dummy_file);
# get rid of the dummy file
unlink($dummy_file);
}
# if it's not a URL, we can simply open the image directly
else {
$image = ImageCreateFromGif($file_or_url);
}
if ($image) { return $image; }
else { return 0; }
}
$image = "http://i.imgur.com/".$_GET["i"].".gif";
$img = myImageCreateFromGif($image);
if($img) {
header("Content-Type: image/png");
ImagePNG($img);
ImageDestroy($img);
}
?>
Which works fine, but the GIF does not fully load before it becomes a PNG, so the page returns either a broken image if the GIF could not load at all, or a partially-loaded GIF that fills the unloaded part by repeating what it has managed to load. So, how can I get the GIF to load completely before making it a PNG?
Upvotes: 1
Views: 1394
Reputation: 7722
You should use perl for retrieving files over http.
This is from the php manuals: http://www.php.net/manual/de/function.curl-exec.php
/**
* Send a GET requst using cURL
* @param string $url to request
* @param array $get values to send
* @param array $options for cURL
* @return string
*/
function curl_get($url, array $get = NULL, array $options = array())
{
$defaults = array(
CURLOPT_URL => $url. (strpos($url, '?') === FALSE ? '?' : ''). http_build_query($get),
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 4
);
$ch = curl_init();
curl_setopt_array($ch, ($options + $defaults));
if( ! $result = curl_exec($ch))
{
trigger_error(curl_error($ch));
}
curl_close($ch);
return $result;
}
It will return the file contents of the file you have set in th $url
parameter.
Upvotes: 0
Reputation: 90335
I would use ImageMagick's convert
to transform the first frame of the GIF into PNG. You address the first frame by adding [0]
to the filename.
Oh, and recent versions of convert
can directly handle URIs for source file locations just well:
convert "http://imgur.com/a.gif[0]" a.png
or
convert "http://imgur.com/a.gif[0]" -thumbnail 128x128 a.png
Upvotes: 1