I have a php script which dynamically generates thumbnail images of larger images without storing it on the web server. The problem is that when the image is a transparent GIF image the thumbnails generated are not transparent. It correctly generates transparent thumbnails for for transparent PNG format image. The only problem is with transparency of GIF images. Here is the script:
<?php
//ex . <img src="thumb.php?p=pp.png&q=4&w=60"/>
if(!isset($_GET['p'])){exit;}
if(!isset($_GET['h']) && !isset($_GET['w'])){
list($w,$h,$type,$attr) = getimagesize($_GET['p']);
$_GET['w'] = $w;
$_GET['h'] = $h;
}else if(!isset($_GET['w'])){
$_GET['w'] = 0;
}else if(!isset($_GET['h'])){
$_GET['h'] = 0;
}
if(!isset($_GET['q'])){$_GET['q'] = 100;}
$info = pathinfo($_GET['p']);
switch($info['extension']){
case 'gif' : $t = 1; break;
case 'jpg' : $t = 2; break;
case 'png' : $t = 3; break;
}
if($t==1){
header("Content-Type: image/gif");
$img = imagecreatefromgif($_GET['p']);
}else if($t==2){
header("Content-Type: image/jpg");
$img = imagecreatefromjpeg($_GET['p']);
}else if($t==3){
header("Content-Type: image/png");
$img = imagecreatefrompng($_GET['p']);
}else{
exit;
}
$orSize = orSize($img);
$th = thSize($orSize,$_GET['w'],$_GET['h']);
$tmp_img = imagecreatetruecolor( $th['w'],$th['h'] );
//if image is GIF or PNG format, produce transparent images
if ($t==1 || $t==3) {
imagealphablending($tmp_img, false);
imagesavealpha($tmp_img, true);
if ($t==3)
{
$source = imagecreatefrompng($_GET['p']);
}
else {
$source = imagecreatefromgif($_GET['p']);
}
imagealphablending($source, true);
imagecopyresampled($tmp_img, $source, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}else{
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}
if(isset($_GET['s'])){
//S VAR OUTPUTS IT AS DIFFERENT FORMAT
$t = $_GET['s'];
}
if(!isset($_GET['save'])){
//SAVE VAR NEEDS TO BE THE PATH TO SAVE TO AND FILENAME
$_GET['save'] = null;
}
if($t==1){
imagegif($tmp_img,$_GET['save'],$_GET['q']);
}else if($t==2){
imagejpeg($tmp_img,$_GET['save'],$_GET['q']);
}else if($t ==3){
$_GET['q'] = 10 - ($_GET['q'] /= 10);
imagepng($tmp_img,$_GET['save'],$_GET['q']);
}
imagedestroy($tmp_img);
function orSize($img){
$orSize['w'] = imagesx($img);
$orSize['h'] = imagesy($img);
return $orSize;
}
function thSize($orSize,$w,$h){
$th = Array();
if($w!=0 && $h == 0){
$th['w'] = $w;
$th['h'] = floor( $orSize['h'] * ( $w / $orSize['w'] ) );
}else if($w==0 && $h != 0){
$th['h'] = $h;
$th['w'] = floor( $orSize['w'] * ( $h / $orSize['h'] ) );
}else{
$th['w'] = $w; $th['h'] = $h;
}
return $th;
}
?>
The script works like this, to generate thumbnail just pass the image name as below:
<img src="thumb.php?p=image.png&q=4&w=60"/>
How can i make this script to generate transparent thumbnail image of GIF transparent images? The lines which generate transparent image are as follow:
// if $t is gif or png image
if ($t==1 || $t==3) {
imagealphablending($tmp_img, false);
imagesavealpha($tmp_img, true);
if ($t==3)
{
$source = imagecreatefrompng($_GET['p']);
}
else {
$source = imagecreatefromgif($_GET['p']);
}
imagealphablending($source, true);
imagecopyresampled($tmp_img, $source, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}else{
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $th['w'], $th['h'], $orSize['w'], $orSize['h'] );
}