Me he pasado el día peleando con las librerías
GD de PHP. ¿Cual es el problema?
Tengo un script que comprueba la dirección IP del referer cada vez que se solicita una imagen, para evitar el robo de estas. También me permite manipular imágenes, re-dimensionarlas, re-comprimirlas, etc, sin tener que tener varias versiones guardadas a la vez.
El script lo tenía terminado, pero me di cuenta de un bug muy grabe, terrible. Al re-dimensionar las imágenes no se conservan las transparencias ni en GIF ni en PNG. Es posible, que tampoco se pillen bien los GIFs animados (tengo que comprobarlo aun

), ya veremos...
Después de mucho leer y probar he conseguido solucionar el problema.
Os copio la función que he creado y que permite re-dimensionar imágenes GIF, PNG y JPG, re-comprimiendolas y usando transparencias (y por supuesto, sin hacer uso de programas externos tipo imagemagick

). Me ha costado, pero al fin he solucionado el bug (la batalla con los gifs animados lo doy por perdida

). Disfrutad la función.
/**
$imagepath = ruta y nombre de la imagen
$compress = nivel de compresion para la img resultado
$x = anchura deseada para la img resultado
$y = altura deseada para la img resultado
Anteriormente ya se ha calculado la anchura y altura
para esa imagen en concreto (de forma que se mantengan
las proporciones).
*/ function readImg
($imagepath,
$compress,
$x,
$y) { $attr =
getimagesize($imagepath);
switch ($attr[2]) { case 1:
// GIF $image = imagecreatefromgif
($imagepath);
header('Content-Type: image/gif');
header('Content-transfer-encoding: binary');
// Pixels esquina $tr_color = imagecolorat
($image,
0,
0);
$tl_color = imagecolorat
($image,
$attr[0]-
1,
0);
$br_color = imagecolorat
($image,
0,
$attr[1]-
1);
$bl_color = imagecolorat
($image,
$attr[0]-
1,
$attr[1]-
1);
$newimage = imagecreate
($x,
$y);
// pixel con color negro imagepalettecopy
($newimage,
$image);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
$ptr_over_black = imagecolorat
($newimage,
0,
0);
$ptl_over_black = imagecolorat
($newimage,
$x-
1,
0);
$pbr_over_black = imagecolorat
($newimage,
0,
$y-
1);
$pbl_over_black = imagecolorat
($newimage,
$x-
1,
$y-
1);
// pixel con color blanco $bg = imagecolorallocate
($newimage,
255,
255,
255);
imagefilledrectangle
($newimage,
0,
0,
$x,
$y,
$bg);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
$ptr_over_white = imagecolorat
($newimage,
0,
0);
$ptl_over_white = imagecolorat
($newimage,
$x-
1,
0);
$pbr_over_white = imagecolorat
($newimage,
0,
$y-
1);
$pbl_over_white = imagecolorat
($newimage,
$x-
1,
$y-
1);
if($ptr_over_black !=
$ptr_over_white) { imagefilledrectangle
($newimage,
0,
0,
$x,
$y,
$tr_color);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
imagecolortransparent
($newimage,
$tr_color);
} elseif($ptl_over_black !=
$ptl_over_white) { imagefilledrectangle
($newimage,
0,
0,
$x,
$y,
$tl_color);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
imagecolortransparent
($newimage,
$tl_color);
} elseif($pbr_over_black !=
$pbr_over_white) { imagefilledrectangle
($newimage,
0,
0,
$x,
$y,
$br_color);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
imagecolortransparent
($newimage,
$br_color);
} elseif($pbl_over_black !=
$pbl_over_white) { imagefilledrectangle
($newimage,
0,
0,
$x,
$y,
$bl_color);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
imagecolortransparent
($newimage,
$bl_color);
} imageinterlace
($newimage,
1);
imagegif
($newimage);
break;
case 2:
// JPEG $image = imagecreatefromjpeg
($imagepath);
header('Content-Type: image/jpeg');
header('Content-transfer-encoding: binary');
$newimage = imagecreatetruecolor
($x,
$y);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
imageinterlace
($newimage,
1);
imagejpeg
($newimage,
'',
$compress);
break;
case 3:
// PNG $image = imagecreatefrompng
($imagepath);
header('Content-Type: image/png');
header('Content-transfer-encoding: binary');
$newimage = imagecreatetruecolor
($x,
$y);
imageAlphaBlending
($newimage,
false);
imagecopyresampled
($newimage,
$image,
0,
0,
0,
0,
$x,
$y,
$attr[0],
$attr[1]);
imageinterlace
($newimage,
1);
imagesavealpha
($newimage,
true);
imagepng
($newimage);
break;
} imagedestroy
($image);
imagedestroy
($newimage);
}
Comentarios